2

以前はファイルをアップロードするためのフォームがあり、正常に機能していましたが、驚いたことに、HttpPostedFileBase がモデルにバインドされなくなりました。しばらくして、それは自分が変わったからだと気づきました。

@using (Html.BeginForm("AddDocument", "Documents", FormMethod.Post, new { enctype = "multipart/form-data", @class = "addTab" }))

@using (Html.BeginForm("AddDocument", "Documents", FormMethod.Post, new { @id = "addForm", enctype = "multipart/form-data", @class = "addTab" }))

だから私はに変更しました(IDの@を削除しようとしましたが、どちらも機能しませんでした)

@using (Html.BeginForm("AddDocument", "Documents", new {id= "addForm"}, FormMethod.Post, new { enctype = "multipart/form-data", @class = "addTab" }))

そしてそれは再び働きました。

だから私は長い間間違ったことをしていると思っていたので、ソリューションの他のフォームを変更しました。しかし、私が使用すると

@using (Html.BeginForm("Edit", "Events", new {id = "editForm"}, FormMethod.Post, new { @class = "addTab" }))

それ以外の

@using (Html.BeginForm("AddContact", "Contacts", FormMethod.Post, new { @id = "addForm", @class = "addTab" }))

ID を設定できません (また、他のオプションを使用することもできません)

私はmsdnのドキュメントで決心しようとしていますが、idがルート値とhtml属性のどちらと見なされるべきか、@の目的、使用される場合と使用されない場合、特になぜ失われたのかさえわかりませんマルチパートの場合のバインディング

アップデート:

これはビューです(コメントアウトされたコードで同じ結果を試しました):

@model AddDocumentViewModel

@using (Html.BeginForm("AddDocument", "Documents", new {id= "addForm"}, FormMethod.Post, new { enctype = "multipart/form-data", @class = "addTab" }))
{   
    @Html.ValidationSummary(true, "Please correct the errors and try again.")
    <div id="addDocumentdetails">
        <div>

            @*<input id="File" type="file" name="File" data-val-required="Please select a file" data-val="true" />*@
            @*@Html.ValidationMessage("File")*@
            @Html.TextBoxFor(m => m.File, new { type = "file" })
            @Html.ValidationMessageFor(m => m.File)
            <span class="right">@Html.DropDownListFor(m => m.OwnedItemId, Model.Plans, "Not attached to a plan..")</span>
        </div>
        <div>
            @Html.EditorFor(m => m.Description,
                                new { @class = "addNotes", data_placeholders_focus = "false", placeholder = ViewData.ModelMetadata.Watermark })
            @Html.ValidationMessageFor(m => m.Description)
        </div>
    </div>
    <div class="addDEC">
        <input class="addDECButton" type="submit" value="Save" />
    </div>
}

ビューモデル:

public class AddDocumentViewModel
{
    [Display(Prompt = "Document notes")]
    [DataType(DataType.MultilineText)]
    [StringLength(500, ErrorMessage = "Must be 500 characters or less")]
    public string Description { get; set; }

    public int? OwnedItemId { get; set; }

    public IEnumerable<SelectListItem> Plans { get; set; }

    [Required(ErrorMessage = "Select a file")]
    public HttpPostedFileBase File { get; set; }

コントローラ

[HttpGet]
public ActionResult AddDocument()
{
    var partyId = (int)Session["PartyId"];
    var viewModel = _createBuilder.Build(partyId);
    return PartialView("_AddDocument", viewModel);
}

[HttpPost]
public ActionResult AddDocument(AddDocumentViewModel viewModel)
{
    var partyId = (int)Session["PartyId"];

    if (ModelState.IsValid)
    {
        _documentsManager.AddDocument(viewModel, partyId);

        if (Request.IsAjaxRequest())
            return Json(new { passedValidation = true, action = Url.Action("DocumentList") });

        return RedirectToAction("Index");
    }

    var newViewModel = _createBuilder.Rebuild(viewModel, partyId);
    return PartialView("_AddDocument", newViewModel);

}
4

0 に答える 0