ViewModel не привязывается из формы POST при передаче в метод в качестве параметра - PullRequest
0 голосов
/ 02 октября 2010

Я новичок в asp.net mvc, но я всюду тщательно искал эту тему.

У меня есть класс ViewModel с именем PictureViewModel, который является классом, от которого наследуется представление EditorTemplate: <% @ Control Language = "C #" Inherits = "System.Web.Mvc.ViewUserControl"%>

<div class="editor-label"><%: Html.LabelFor(m=>m.Name) %></div> 
<div class="editor-field"><%: Html.TextBox("form.Name") %></div> 

<div class="editor-label"><%: Html.LabelFor(m=>m.Description) %></div> 
<div class="editor-field"><%: Html.TextArea("form.Description") %></div> 

<% Html.RenderAction("SelectCategory", "Category"); %>

<div class="editor-label"><label for="thumbFile">Thumb</label></div> 
<div class="editor-field"><input id="thumbFile" name="thumbFile" type="file"/></div> 

<div class="editor-label"><label for="fullFile">Full</label></div> 
<div class="editor-field"><input id="fullFile" name="fullFile" type="file"/></div> 

Также у меня есть поля файла и все, что выложено на себя

<%@ Page Title="" Language="C#" MasterPageFile="/Views/Shared/Site_Table.Master"
 Inherits="System.Web.Mvc.ViewPage<MvcApplicationVelarPolya.Areas.Admin.Models.PictureViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Create
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

    <h2>Create</h2>

    <%
  using (Html.BeginForm("create", "Pictures", FormMethod.Post, new {enctype="multipart/form-data"})) 
   {%> 

    <%: Html.EditorForModel() %>

    <input type="submit" name="Create" />

<% }%>

</asp:Content>

А вот код, предназначенный для обработки отправки:

    [HttpPost]
    public ActionResult Create([Bind(Prefix="form")] PictureViewModel pm)
    {
        try
        {
            var p = new PictureViewModel();
            UpdateModel(p, "",new[] {"Name", "Description"});
            ViewData["name"] = Request.Files[0].FileName;
            return View("New", p);
        }
        catch
        {
            return View();
        }
    }

Ни добавление префиксов, ни использование FormCollection с UpdateModel не помогают. Буду очень признателен за любую помощь! Эндрю.

О, да, данные представления правильно заполнены именем файла!

Это тоже не работает [HttpPost] public ActionResult Create (FormCollection fc / [Bind (Prefix = "form")] PictureViewModel pm /) { пытаться { var p = new PictureViewModel (); UpdateModel (p, "form", new [] {"Name", "Description"}); ViewData ["name"] = Request.Files [0] .FileName; // TODO: добавить логику вставки здесь возврат View («Новый», р); return RedirectToAction («Индекс»); } ловить { возврат View (); } }

И этот код

        foreach (var k in fc)
        {
            Debug.WriteLine(k.ToString());
        }

производит

form.Name
form.Description
CategoryID
Create

1 Ответ

1 голос
/ 02 октября 2010

В вашем шаблоне редактора вы должны использовать строго типизированные помощники (TextBoxFor и TextAreaFor), и вы можете избавиться от магических строк и префиксов:

<div class="editor-label"><%: Html.LabelFor(m => m.Name) %></div> 
<div class="editor-field"><%: Html.TextBoxFor(m => m.Name) %></div> 

<div class="editor-label"><%: Html.LabelFor(m => m.Description) %></div> 
<div class="editor-field"><%: Html.TextAreaFor(m => m.Description) %></div> 

<% Html.RenderAction("SelectCategory", "Category"); %>

<div class="editor-label"><label for="thumbFile">Thumb</label></div> 
<div class="editor-field"><input id="thumbFile" name="thumbFile" type="file"/></div> 

<div class="editor-label"><label for="fullFile">Full</label></div> 
<div class="editor-field"><input id="fullFile" name="fullFile" type="file"/></div> 

Для обработки загруженных файлов вы можете добавить ихлибо как свойства модели представления, либо как параметры действия:

public class PictureViewModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public HttpPostedFileBase ThumbFile { get; set; }
    public HttpPostedFileBase FullFile { get; set; }
}

...

[HttpPost]
public ActionResult Create(PictureViewModel pm)
{
    // Normally the pm variable should be fully 
    // initialized here from the POST request and you can use it directly
    // No need to call UpdateModel
    return View("New", pm);
}
...