@ Html.EditorFor (Изображение) - PullRequest
4 голосов
/ 13 марта 2012

Я пытаюсь разрешить пользователю загружать изображение на наш сайт, и я не совсем уверен, как его использовать. Я пытался использовать несколько типов для определения изображения, включая System.Drawing.Image и HttpPostedFileWrapper, но @Html.EditorFor всегда (понятно) вызывает его атрибуты в качестве полей для редактирования.

На мой взгляд, у меня было, вместо @Html.EditorFor у меня было <input type="file" name="imageToUpload" />, но оно не было воспринято как часть Model? Я новичок в MVC, так что я надеюсь, что это что-то тривиальное.

Вот мой взгляд:

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>New Image</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Description)
            @Html.ValidationMessageFor(model => model.Description)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Image)
        </div>
        <div class="editor-field">
            <input type="file" name="imageToUpload" />
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Мой контроллер:

    [HttpPost]
    public ActionResult CreateImage(string brand, string collection, ImageEditViewModel imageEditViewModel)
    {
        string fileName = Guid.NewGuid().ToString();
        string serverPath = Server.MapPath("~");
        string imagesPath = serverPath + String.Format("Content\\{0}\\Images\\", Helper.Helper.ResolveBrand());

        string newLocation = Helper.Helper.SaveImage(fileName, imagesPath, imageEditViewModel.Image.InputStream)

        Image image = new Image
        {
            Collection = ds.Single<Collection>(c => c.Season == collection
                && c.Brand.Name == brand),
            Description = imageEditViewModel.Description,
            Location = "newLocation",
            Order = Helper.Helper.GetImageOrder(brand, collection)
        };

        ds.InsertOnSubmit<Image>(image);
        ds.SubmitChanges();

        return RedirectToAction("Brand");
    }

И, наконец, ViewModel:

public class ImageEditViewModel
{
    public int CollectionId { get; set; }

    public string Description { get; set; }

    public HttpPostedFileWrapper Image { get; set; }

    public int Order { get; set; }
}

1 Ответ

15 голосов
/ 13 марта 2012

Обязательно укажите правильный enctype="multipart/form-data" в своей форме, иначе вы не сможете загружать файлы:

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>New Image</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Description)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Description)
            @Html.ValidationMessageFor(model => model.Description)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ImageToUpload)
        </div>
        <div class="editor-field">
            <input type="file" name="imageToUpload" />
        </div>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

И если вы хотите использовать EditorFor помощник для генерации файла ввода, вы можете использовать следующее:

<div class="editor-label">
    @Html.LabelFor(model => model.ImageToUpload)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.ImageToUpload)
</div>

, а затем определите пользовательский шаблон редактора для типа HttpPostedFileBase (см. Ниже, что вам нужно изменить свою модель для фактического использования этого типа). Так что редактор шаблона в ~/Views/Shared/EditorTemplates/HttpPostedFileBase.cshtml:

@model HttpPostedFileBase
@Html.TextBox("", null, new { type = "file" })

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

public class ImageEditViewModel
{
    public int CollectionId { get; set; }

    public string Description { get; set; }

    public HttpPostedFileBase ImageToUpload { get; set; }

    public int Order { get; set; }
}

Также не забудьте оформить следующую запись в блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...