查看模型数据注释与索引方法模型数据注释参数

本文关键字:数据 模型 注释 方法 参数 索引 | 更新日期: 2023-09-27 18:22:37

这让我有点困惑。控制器方法Index从我的模型库接收到一个对象参数,该模型库有自己的数据注释规范,如下面的签名:

public ActionResult Index(vwClient Registro = null)

但我的Index返回了一个ActionResult,其中创建了一个不同的对象模型来满足视图的需要,它有一些属性与参数Registero的名称相同,但数据注释属性不同:

ViewModel.Registro MyViewModel = new ViewModel.Registro();
return View(MyViewModel);

并且我的视图期望ViewModel的模型。Registero类型:

ViewModel.Registro

问题来了。ViewModel.Registro的数据注释属性已被完全忽略(DisplayFor、ValidationMessageFor)。数据注释规范来自vwClient。如果我将参数类型更改为对象,问题将停止:

public ActionResult Index(object Registro = null)

有人知道我在这里错过了什么吗?请不要问我为什么要这么做。我只是想了解这种MVC行为。


下面是类的代码示例:

//it comes from my model library. Note here the id property is marked as Required
public class vwClient
{
    [Required]
    [DisplayName("Client")]
    public int? id { get; set; }
    [DisplayName("Date")]
    public DateTime dateCreation { get; set; }
    [DisplayName("Company")]
    public SelectList CompanyList { get; set; }
    [DisplayName("Client")]
    public SelectList ClientList { get; set; }
}
//here is the other class used as model by the view
public class Registro
{
    [DisplayName("Client")]
    public int? id { get; set; }
    [DisplayName("Date")]
    public DateTime dateCreation { get; set; }
    [DisplayName("Company")]
    public SelectList CompanyList { get; set; }
    [DisplayName("Client")]
    public SelectList ClientList { get; set; }
}

现在是控制器的Index方法。当我将Registero声明为vwClient时,我遇到了问题。

public ActionResult Index(vwClient Registro = null)
{
    MyViewModel.Registro MyViewModel = new ViewModel.Registro();
    return View(MyViewModel);
}

现在,通过将Registero声明为对象来修复问题的控制器的Index方法。

public ActionResult Index(object Registro = null)
{
    MyViewModel.Registro MyViewModel = new ViewModel.Registro();
    return View(MyViewModel);
}

以下是视图的部分代码作为示例:

@model ViewModel.Registro
<div class="form-group">
@Html.LabelFor(model => model.id, htmlAttributes: new { @class = "control-label" })
<div class="form-control-wrapper">
    @Html.DropDownListFor(model => model.id, selectList: (SelectList)Model.ClientList, htmlAttributes: new { @class = "form-control"}, optionLabel: string.Empty)
    @Html.ValidationMessageFor(model => model.id, "", new { @class = "text-danger" })
</div>

如果问题足够清楚,请告诉我。

查看模型数据注释与索引方法模型数据注释参数

正如@Stephen Muecke在评论中所说:

不要在GET方法中使用模型作为参数(因为它会添加ModelState错误,这就是为什么您在视图中出现错误的原因(而且您甚至似乎没有使用它,那么这有什么意义呢?)。我不知道你评论的第二部分想说什么:)——斯蒂芬·穆克11月19日上午10:51

它完全解释了我的问题。谢谢你的帮助。