【问题标题】:ASP.NET MVC - Make a property required, but not from viewASP.NET MVC - 使属性成为必需,但不是从视图中
【发布时间】:2018-02-06 16:42:01
【问题描述】:

如果我有一个 MVC 模型(非常简化),看起来像这样;

public class Person
{

    [Required]
    public string SpecialSauce { get; set; }

    [Required]
    public string Name { get; set; }

}

但是,只有Name 来自视图。 SpecialSauce 是在服务器端提供的。

person.SpecialSauce = "Ketchup"; //Hard-coded for example

但是,在我保存之前,我检查了 ModelState.IsValid,它返回 false,并显示错误“需要 SpecialSauce 字段”。

如何在服务器端提供所需的模型属性时使 ModelState 有效?我可以删除 [Required] 数据注释,但我希望 EF 数据库列不可为空。

【问题讨论】:

  • 使用 viewmodel 而不是你的 db 类,这次不要添加所需的属性。
  • 所以我需要一个单独的视图模型?这是非常基本的,需要一个单独的模型似乎很可惜,但如果这是标准做法......
  • 从模型中移除[Required] 属性,但使用EF Fluent API 配置数据库映射。此外,最好创建一个视图模型来分离关注点。
  • 那时你需要第二个分辨率,或者你可以编写你的验证属性并控制它。 stackoverflow.com/questions/20642328/…

标签: asp.net-mvc entity-framework


【解决方案1】:

坦率地说,不太确定您希望SpecialSauce 如何成为必需,但不允许用户在表单上输入SpecialSauce 的值,然后您在控制器中覆盖它。

但是.. 如果需要SpecialSauce,这是一个答案。

由于您是在服务器端设置person.SpecialSauce,因此您应该在HttpGet 方法中设置它。然后将整个对象返回给视图。如果您不希望用户编辑该字段,请通过 HTML 或 jQuery 禁用它。

这是一个例子:

控制器

// GET: ControllerName/Create
public ActionResult Create()
{
    var myPerson = new Person()
    {
        SpecialSauce = "Ketchup"
    };

    return View(myPerson); // assuming your view is named Create and it is expecting an object of type Person.
}

查看

@model Project.Models.Person // top of view

@Html.HiddenFor(model => model.SpecialSauce) // you can't submit disabled items to the server so create a HiddenField to hold the actual value for submission

@Html.TextBoxFor(model => model.SpecialSauce, null, new { @class = "form-control", @disabled = "disabled" }) // the textbox on page load should contain "Ketchup" and be disabled so the user can't edit the string

然后,您的 ModelState 将是有效的,然后您不必在 HttpPost 操作方法中设置它。

如果这有帮助,请告诉我。

【讨论】:

  • 我想我开始意识到约定是有一个特定于您的视图的模型,以及一个特定于数据库的单独模型,因为在我的情况下,“特殊酱汁”是查找的结果人名。我在 MVC 上浏览的教程没有谈到这种区别。
  • @n00b 在这种情况下,ViewModel 将是合适的,然后查看 AutoMapper 以轻松映射属性,而不必手动编写每个属性。
  • 你会遇到一个过度张贴的问题。由于您在模型中定义了 specialsauce,因此任何人都可以使用 fiddler/postman/ 将值发布到 SpecialSauce... 此外,禁用的输入项也不会在 POST 中发送回服务器。使用视图模型。
  • @Fran 关于无法提交禁用项目的好点。我更新了我的答案以反映提交的 HiddenFor。我同意 ViewModel 方法。我的回答只是基于我得到的信息。
  • 留下这个作为选择的答案,因为你回答了这个问题,但我最后同意,我需要一个视图模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多