Параметры динамической формы начала PartialView

Если у меня есть ниже PartialView

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Models.Photo>" %>

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

    <%= Html.EditorFor( c => c.Caption ) %>

    <div class="editField">
        <label for="file" class="label">Select photo:</label>
        <input type="file" id="file" name="file" class="field" style="width:300px;"/>
    </div>

  <input type="submit" value="Add photo"/>

<%} %>

Как видите, действие и контроллер жестко закодированы. Есть ли способ сделать их динамическими?

Моя цель состоит в том, чтобы сделать это частичное представление достаточно общим, чтобы я мог использовать его во многих местах и ​​передать его действию и контроллеру, в которых он находится.

Я знаю, что могу использовать ViewData, но на самом деле не хочу, а также с передачей VormViewModel в представление и использованием свойств модели.

Есть ли более приятный способ, чем два, которые я перечислил выше?


person griegs    schedule 29.01.2010    source источник


Ответы (1)


Я проверил исходный код MVC и покопался в System.Web.Mvc --> Mvc --> Html --> FormExtensions, поэтому я обнаружил, что вы можете написать какой-то код, например:

public static class FormHelpers
{
    public static MvcForm BeginFormImage(this HtmlHelper htmlHelper,  IDictionary<string, object> htmlAttributes)
    {
        string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
        return FormHelper(htmlHelper, formAction, FormMethod.Post, htmlAttributes);
    }

    public static MvcForm FormHelper(this HtmlHelper htmlHelper, string formAction, FormMethod method, IDictionary<string, object> htmlAttributes)
    {
        TagBuilder tagBuilder = new TagBuilder("form");
        tagBuilder.MergeAttributes(htmlAttributes);
        // action is implicitly generated, so htmlAttributes take precedence.
        tagBuilder.MergeAttribute("action", formAction);
        tagBuilder.MergeAttribute("enctype", "multipart/form-data");
        // method is an explicit parameter, so it takes precedence over the htmlAttributes.
        tagBuilder.MergeAttribute("method", HtmlHelper.GetFormMethodString(method), true);
        htmlHelper.ViewContext.Writer.Write(tagBuilder.ToString(TagRenderMode.StartTag));
        MvcForm theForm = new MvcForm(htmlHelper.ViewContext);

        if (htmlHelper.ViewContext.ClientValidationEnabled)
        {
            htmlHelper.ViewContext.FormContext.FormId = tagBuilder.Attributes["id"];
        }

        return theForm;
    }
}

Я не уверен, что это именно то, что вы действительно хотите получить, но я уверен, что вы можете получить это, если измените эти строки таким образом, чтобы удовлетворить ваши потребности. Надеюсь это поможет.

person ali62b    schedule 29.01.2010