使用带有可选对象的列表的Html.EditorFor

时间:2017-01-11 10:02:59

标签: razor asp.net-core asp.net-core-mvc

我有一个类似

的模型
public class A {
   // Properties - some of them are required some optional
   // Optional
   public class ICollection<B> Items { get; set; }
}
public class B {
    public string A {get;set;} // Required
}

要使用Html.EditoFor(o => o.Items[0])我必须向Items添加一个空对象,因此会将此对象发送到服务器,导致ModelState.IsValid为假(如果用户未选择)添加任何B s。

如何正确处理此问题?可选的是为集合创建[Optional]属性,该集合可以检查列表并检查它是否只包含一个对象,如果该对象是默认对象,则跳过它。

Items属性在客户端通过调用呈现局部视图(Html.EditoFor(o => o.Items[0]))的控制器以及更多js-fiddle来填充,以确保所有索引都正确。

谢谢!

1 个答案:

答案 0 :(得分:0)

我在Github问here问了一个问题,并得到了一个正确指示我的答案。

替代解决方案

// PartialView _AddContact.cshtml
@model App.Features.Customer.CustomerContactModel

@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "Contacts[0]";
}

@Html.EditorForModel()

// PartialView _AddContacts.cshtml
@model IList<App.Features.Customer.CustomerContactModel>

@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "Contacts";
}

@Html.EditorForModel()

// Usage Edit.cshtml
@Html.Partial("_AddContact", new CustomerContactModel())

// Usage Create.cshtml
@Html.Partial("_AddContact")

// Controller action called from javascript do append partial views to DOM
public IActionResult AddContact([FromForm] IList<CustomerContactModel> contacts)
        {
            if (ModelState.IsValid)
            {
                ViewData["inline"] = true; // Different template for inline edit
                return PartialView(contacts);
            }
            return new JsonResult(ModelState)
            {
                StatusCode = (int) HttpStatusCode.BadRequest
            };
        }