gpt4 book ai didi

asp.net-mvc - 谁负责加载数据?

转载 作者:行者123 更新时间:2023-12-02 09:39:39 24 4
gpt4 key购买 nike

在MVC模型中,加载 View 模型的职责在哪里?

Controller 应该加载数据吗?如果 View 模型本身加载数据ala: MyViewModel viewModel = MyViewModel.Create(someValue);服务层是否应该加载它: MyViewModel viewModel = MembershipService.Instance.Load(someValue);

最佳答案

请参阅这个真正干净技术的示例: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/06/29/how-we-do-mvc-view-models.aspx

或者,您也可以手动执行此操作:请参阅“ASP.NET MVC In Action”一书或 CodeCampServer示例来源。基本上你注入(inject) IViewModelMapper { public ViewModel Map(data); } 到 Controller 。巧妙的是,它使您的 IoC 自动将服务和存储库传递给您的 ViewModel 映射器。然而,这确实会使 Controller 因映射器接口(interface)而变得臃肿,因此像 Jimmy Bogard 的技术一样,即使没有 AutoMapper,但使用操作过滤器也比选择 IViewModelMapper 会更好。

如果你做不到这一点,那么我建议坚持使用 ViewModel 处理映射,如 Mathias 建议的那样。

更新:这是一个使用 CodeCampServer 方式进行类似自动映射器配置的示例。不确定它是否会按原样工作(或根本有用),只是一个演示。

public abstract class ViewModelMapper<Source, ViewModel> where Source: class, ViewModel: IViewModel
{
public abstract ViewModel Map(Source source);
}

public class ProductDetailsViewModel
{
public ProductViewModel Product { get; set; }
punlic IList<Language> AvailableProductLanguages { get; set; }
}

public class ProductDetailsViewMapper: ViewModelMapper<Product, ProductDetailsViewModel>
{
private ILanguageRepository languages;
public ProductDetailsViewMapper(ILanguageRepository languages)
{
this.languages = languages;
}
public override ProductDetailsViewModel Map(Product source)
{
var vm = new ProductDetailsViewModel();
AutoMapper.Map<Product, ProductDetailsViewModel>(product, vm);
vm.AvailableProductLanguages = languages.GetAppropriateFor(product);
}
}

public class ViewModelMapperActionFilter: ActionFilter
{
Type mapperType;
public ViewModelMapperActionFilter()
{
}
public ViewModelMapperActionFilter(Type mapperType)
{
}
public void OnActionExecuted(ControllerContext context)
{
var model = context.Result.ViewData.Model;
var mapperType = this.MapperType ?? this.GetMapperTypeFromContext(context);
// this is where magic happens - IoC grabs all required dependencies
var mapper = ServiceLocator.GetInstance(mapperType);
var method = mapperType.GetMethod("Map");
Check.Assert(method.GetArguments()[0].ArgumentType == model.GetType());
context.Result.ViewData.Model = method.Invoke(mapper, new[]{model});
}
}

public class ProductsController: Controller
{
[ViewModelMapper(typeof(ProductDetailsViewMapper))]
// alternatively [ViewModelMapper()] will auto-pick mapper name by controller/action
public ActionResult Details(EntityViewModel<Product> product)
{
// EntityViewModel is a special type, see
// http://stackoverflow.com/questions/1453641/my-custom-asp-net-mvc-entity-binding-is-it-a-good-solution
return View(product.Instance);
}
}

//Global.asax.cs:
IoC.Register(AllTypes.DerivedFrom(typeof(ViewModelMapper<>)));

关于asp.net-mvc - 谁负责加载数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1593406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com