gpt4 book ai didi

c# - 处理 MVC 后期模型的最佳实践是什么?

转载 作者:太空狗 更新时间:2023-10-30 01:22:02 25 4
gpt4 key购买 nike

我是 MVC 的新手,仍然对 2 个案例的最佳和正确方法感到困惑,但结果相同。假设一些用户应该为特定的根类别添加新的子类别。

案例 1:SubCategory 是 EF 的映射类,其中所有属性都不可为 null。

Controller :

    [Authorize]
public ActionResult Create()
{
SubCategory subCategory = new SubCategory();

subCategory.RootCategoryID = 1;

return View(subCategory);
}

[Authorize]
[HttpPost]
public ActionResult Create(SubCategory thisSubCategory)
{
if (ModelState.IsValid)
{
//And some BL logic called here to handle new object...
}
}

查看:

    @Html.HiddenFor(model => model.ID)

@Html.HiddenFor(model => model.RootCategoryID)

<h3>Sub Category Name: </h3>

@Html.EditorFor(model => model.CategoryName)

@Html.ValidationMessageFor(model => model.CtaegoryName)

<input id="btnAdd" type="submit" value="Add" />

案例 2:添加辅助类作为 Controller 的模型并在发布后填充 EF 对象

Controller :

    class SubCategoryHelper
{
public string Name { get; set; }
}

[Authorize]
public ActionResult Create()
{
SubCategoryHelper subCategory = new SubCategoryHelper();

return View(subCategory);
}

[Authorize]
[HttpPost]
public ActionResult Create(SubCategoryHelper thisSubCategory)
{
if (ModelState.IsValid)
{
SubCategory newSubCategory = new SubCategory();

newSubCategory.RootCategoryID = 1;

newSubCategory.CtaegoryName = thisSubCategory.Name;

//And some BL logic called here to handle new object...
}
}

查看:

子类别名称:

    @Html.EditorFor(model => model.Name)

@Html.ValidationMessageFor(model => model.Name)

<input id="btnAdd" type="submit" value="Add" />

两种方式都一样,但第一种方式看起来不太安全,因为可以在客户端更改隐藏项。第二种方式更长,想象一下对于客户端或产品等富对象的相同方式......我应该选择什么?还是有别的办法?

最佳答案

第一种情况很简单。如果您扩展模型,您将不得不在更少的地方进行更改。它的安全性并不少。您可以通过多种方式绕过创建或绑定(bind)隐藏的输入字段。

使用BindAttribute绕过属性绑定(bind):

ActionResult Create([Bind(Exclude = "RootCategoryId")]
SubCategoryHelper thisSubCategory) {//....}

或模型类属性上的ScaffoldColumnAttribute(例如,当您使用编辑模板时):

[ScaffoldColumn(false)]
public int RootCategoryId {get; set;}

或者只是简单地不公开它(就像您在示例中使用 Html.HiddenInput 帮助器所做的那样)。


第二种方法,您已经描述过,通常称为 ViewModel 模式。它鼓励分离您的表示层和领域层。优点是,您的域模型不会被表示层特定代码(如各种显示属性等)污染。然而,它带来了域模型和 View 模型之间映射的另一个开销。

可能没有通用的经验法则。这取决于您的应用程序类型。

如果它基本上是一些简单的数据驱动的 CRUD 应用程序,您可以轻松地使用第一个。然而,当您的应用程序变得更大时,您一定会欣赏到您的双手在不同层上的自由。如果您的 BLL 代码与除 ASP MVC 之外的某些其他类型的“客户端”(Web 服务、桌面等)一起使用,我肯定会选择第二个选项。

我还建议阅读这篇很棒的文章:Is layering worth mapping

关于c# - 处理 MVC 后期模型的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14666142/

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