Можно ли использовать EditorFor () для создания? - PullRequest
23 голосов
/ 24 мая 2011

С учетом этой модели, возможно ли использовать Html.EditorFor () для рендеринга элемента загрузки файла на страницу?Я поиграл с Datatype свойства FileName, и это определенно сказалось на визуализированной форме редактора.

public class DR405Model
{
    [DataType(DataType.Text)]
    public String TaxPayerId { get; set; }
    [DataType(DataType.Text)]
    public String ReturnYear { get; set; }

    public String  FileName { get; set; }
}

Сильно типизированная * .aspx страница выглядит так

    <div class="editor-field">
        <%: Html.EditorFor(model => model.FileName) %>
        <%: Html.ValidationMessageFor(model => model.FileName) %>
    </div>

Ответы [ 4 ]

37 голосов
/ 25 мая 2011

Было бы более разумно использовать HttpPostedFileBase для представления загруженного файла в вашей модели представления вместо string:

public class DR405Model
{
    [DataType(DataType.Text)]
    public string TaxPayerId { get; set; }

    [DataType(DataType.Text)]
    public string ReturnYear { get; set; }

    public HttpPostedFileBase File { get; set; }
}

тогда вы могли бы иметь следующий вид:

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

    ... input fields for other view model properties

    <div class="editor-field">
        <%= Html.EditorFor(model => model.File) %>
        <%= Html.ValidationMessageFor(model => model.File) %>
    </div>

    <input type="submit" value="OK" />
<% } %>

И, наконец, определите соответствующий шаблон редактора внутри ~/Views/Shared/EditorTemplates/HttpPostedFileBase.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<input type="file" name="<%: ViewData.TemplateInfo.GetFullHtmlFieldName("") %>" id="<%: ViewData.TemplateInfo.GetFullHtmlFieldId("") %>" />

Теперь контроллер может выглядеть так:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new DR405Model());
    }

    [HttpPost]
    public ActionResult Index(DR405Model model)
    {
        if (model.File != null && model.File.ContentLength > 0)
        {
            var fileName = Path.GetFileName(model.File.FileName);
            var path = Path.Combine(Server.MapPath("~/App_Data"), fileName);
            model.File.SaveAs(path);
        }

        return RedirectToAction("Index");
    }
}
9 голосов
/ 17 ноября 2015

Вот пример для MVC 5 (требуется для htmlAttributes).

Создайте его как файл с именем HttpPostedFileBase.cshtml в ~ \ Views \ Shared \ EditorTemplates

@model HttpPostedFileBase
@{
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]);
    htmlAttributes["type"] = "file";
}
@Html.TextBoxFor(model => model, htmlAttributes)

Это создаетэлемент управления с правильным идентификатором и именем и работает при редактировании коллекций из шаблона EditorFor шаблона.

4 голосов
/ 30 января 2017

Добавить: htmlAttributes = new {type = "file"}

<div class="editor-field">
    <%: Html.EditorFor(model => model.FileName, new { htmlAttributes = new { type = "file" }) %>
    <%: Html.ValidationMessageFor(model => model.FileName) %>
</div>

Примечание: я использую MVC 5, я не тестировал другие версии.

0 голосов
/ 24 мая 2011
...