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

时间:2015-11-18 12:47:35

标签: c# asp.net-mvc model-view-controller annotations

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

public ActionResult Index(vwClient Registro = null)

但是我的索引返回了一个ActionResult,其中创建了一个不同的对象模型,只是为了填充视图必需品,它有一些属性与参数Registro的名称相同但有不同的数据注释属性:

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

我的观点是期待一个ViewModel.Registro类型的模型:

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方法。当我宣布Registro为vwClient时,我遇到了问题。

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

现在通过将Registro声明为对象来解决问题的控制器的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>

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

1 个答案:

答案 0 :(得分:0)

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

  

不要在GET方法中使用模型作为参数(因为它会添加ModelState错误,这就是为什么你在视图中得到错误的原因(你甚至似乎没有使用它,那么重点是什么?)我不知道你在评论的第二部分想说什么:) - Stephen Muecke 11月19日10:51

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