绑定复杂ViewModels的名称约定是什么?

时间:2013-04-06 21:56:24

标签: file-upload asp.net-mvc-4 binding

我有两个 ViewModels

public class AboutViewModel : ViewModel
{
    public override long Id { get; set; }        
    public override string PageTitle { get; set; }        
    public override string TitleDescription { get; set; }        
    public override string ContentTitle { get; set; }
    public virtual AboutItemViewModel AboutItem { get; set; }
}

public class AboutItemViewModel
{
    public long Id { get; set; }

    [AllowHtml]        
    public string Content { get; set; }
    public string ImageUrl { get; set; }
    public HttpPostedFileBase FileToUpload { get; set; }
}

Here is my controller:

    [ValidateInput(false)]
    [ValidateAntiForgeryToken, HttpPost]
    public ActionResult Create(long? siteid, long? cid, AboutViewModel model)
    {
        return View(model);
    }

这是我的观点:

@using (Html.BeginForm("Create", "About", new { siteid = ViewData["siteid"], cid = ViewData["cid"] },FormMethod.Post,new { enctype = "multipart/form-data", @class = "form-horizontal rtl", autocomplete = "off" }))
{
     <div class="controls">
       <input type="file" name="FileToUpload" id="FileToUpload" style="margin-right: -9px;">
     </div>
     <div class="controls">
        @Html.ValidationMessageFor(o => o.AboutItem.FileToUpload, "", new { id = "spanfile", @class = "alert alert-block alert-error span3 pull-right", style = "margin-right: 160px;" })
     </div>   
     <div class="control-group pull-left">
        <button type="submit" class="btn btn-large" data-toggle="button">Save</button>
    </div> 
}

如何将文件绑定到 FileToUpload 以停止向我返回null?

Except: 如果我把它放在主 AboutViewModel 中,那么它会返回正确的值。

1 个答案:

答案 0 :(得分:2)

由于FileToUpload属性位于AboutItem proprety(父ViewModel的类属性)中,因此您需要在输入元素的名称前面加上它来自的属性。这是一个很长的路要说文件输入的名称应该是AboutItem.FileToUpload。

<input type="file" name="AboutItem.FileToUpload" id="AboutItem_FileToUpload" />

这应该为您处理模型绑定。此外,您可以通过在AboutItem类的其他属性上使用HTML帮助程序来测试它。例如:

@Html.TextBoxFor(x=>x.AboutItem.Id)

这应该在HTML中呈现

<input type="text" name="AboutItem.Id" id="AboutItem_Id />

修改

显然,id属性将使用下划线而不是点来呈现。但是,由于ID属性未在模型绑定中使用,因此它并不重要。