0

我没有任何其他方式来描述它,然后我在标题中是如何做到的。

我有一个看起来像这样的视图模型:

public class CreateArtistModel
{        
    public IEnumerable<SelectListItem> Cultures { get; set; }
    public IEnumerable<SelectListItem> Products { get; set; }
    public Artists Artist { get; internal set; }

    /// <summary>
    /// Default constructor
    /// </summary>
    public CreateArtistModel() { }

    /// <summary>
    /// Non-default constructor with 1 parameter, culturelist
    /// </summary>
    /// <param name="cultures">List that can contain all the possible cultures.</param>
    /// <param name="products">List that can contain all possible products.</param>
    public CreateArtistModel(IEnumerable<SelectListItem> cultures, IEnumerable<SelectListItem> products) { Cultures = cultures; Products = products; }

    /// <summary>
    /// Non-default constructor that can have 1 parameter, artist
    /// </summary>
    /// <param name="artist">The artist with its various properties</param>
    public CreateArtistModel(Artists artist) { Artist = artist; }

    /// <summary>
    /// Non-default constructor that can have 2 parameter, a list cultureList and an atist
    /// </summary>
    /// <param name="cultures">List that can contain all the possible cultures.</param>
    /// <param name="products">List that can contain all possible products.</param>
    /// <param name="artist">The artist with its various properties</param>
    public CreateArtistModel(IEnumerable<SelectListItem> cultures, IEnumerable<SelectListItem> products, Artists artist)
    {
        Cultures = cultures;
        Products = products;
        Artist = artist;
    }

    [Required(ErrorMessage = "The artist's first name is required")]
    public string firstname { get; set; }

    [Required(ErrorMessage = "The artist's last name is required")]
    public string lastname { get; set; }

    public Nullable<int> dateOfBirth { get; set; }

    public Nullable<int> dateOfDeath { get; set; }

    [Required(ErrorMessage = "The artist's speciality is required")]
    public string speciality { get; set; }

    public string placeOfBirth { get; set; }
}

然后我的视图使用如下属性:

@model ArtWebShop.Areas.Admin.Models.CreateArtistModel

@Html.EditorFor(model => model.firstname)
@Html.ValidationMessageFor(model => model.firstname)

然后在我的控制器中我像这样保存它:

        [HttpPost]
    public ActionResult Create(Artists artist)
    {
        if (!ModelState.IsValid)
        {
            return View(CreateArtistWithListOfProductsAndcultures(artist));
        }

        if (_unitOfWork != null)
        {
            _unitOfWork.ArtistsRepository.Create(artist);
            _unitOfWork.Save();
        }
        return RedirectToAction("Index", "Overview", new { area = "Admin" });
    }

那行得通!但我不确定为什么...

我想确切地了解为什么会这样。为什么我的视图模型中的属性会自动链接到艺术家模型?

4

1 回答 1

1

好吧,我的模型绑定器完成了魔法。默认的 ASP.Net modelbinder具有从表单发布数据和\或查询字符串重新创建操作参数的能力。因此,当 POST 发生时,Modelbinder 会启动并检查 post 数据的编码并尝试为您的操作方法构造对象。它根据参数 - 属性名称匹配进行映射。

这也意味着 Modelbinder 确实关心您的 Model 或 ViewModel 类。只要它在操作参数中获得类类型,它就会尝试将 POST(正文内容)或 GET(查询字符串)参数映射到您的自定义类属性。您的 ViewModel 实际上在这里无关紧要,除了它有助于呈现 html 表单,其 INPUT 元素的名称与模型属性匹配。

您可以查看这些文章以深入了解 Modelbinders。

http://msdn.microsoft.com/en-us/magazine/hh781022.aspx

http://www.codeproject.com/Articles/159749/ASP-NET-MVC-Model-Binding-Part1

http://www.codeproject.com/Articles/161963/ASP-NET-MVC-Model-Binding-Part-2

于 2013-08-03T11:38:16.707 回答