Создать RouteValueDictionary на сервере и использовать в aspx? - PullRequest
1 голос
/ 29 ноября 2011

Я пытаюсь передать RouteValueDictionary моему aspx, чтобы я мог использовать его в качестве параметров для Ajax.BeginForm метода. Я загружаю это так:

 RouteValues = new System.Web.Routing.RouteValueDictionary();

 RouteValues.Add("FindingId", thisFinding.Id);
 RouteValues.Add("ReportId", thisFinding.ReportSection.ReportId);

, а затем добавить его к моей модели без проблем. Когда я добавляю его в качестве параметра к методу BeginForm, он отображает действие следующим образом:

/SolidWaste/Finding/LoadSection?Count=3&Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D

Вот код aspx:

(Ajax.BeginForm(Model.FormModel.Action,
    Model.FormModel.Controller, 
    Model.FormModel.RouteValues,
new AjaxOptions {
    HttpMethod = "Post",
    InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace,
    UpdateTargetId = "WindowContent",
}, new { id = FormId })) { %>
<input name="submit" type="submit" class="button" value="" style="float: right;"/>
<%  } //End Form %>

Вот модель представления, которая представляет Model.FormModel

    public class FormViewModel {

    public string Action { get; set; }

    public string Controller { get; set; }

    public string Method { get; set; }

    public RouteValueDictionary RouteValues { get; set; }
}

Есть идеи, почему он не сериализует RouteValueDictionary в правильный URL-адрес действия? Я хотел бы использовать объект здесь, а не строить RouteValues ​​вручную с помощью new { field = vale }

1 Ответ

3 голосов
/ 29 ноября 2011

Ах, вы используете неправильную перегрузку. Это нормально. Команда ASP.NET MVC действительно испортила этот API. Вы должны быть осторожны, какой метод вы используете. Вот необходимая перегрузка :

<% using (Ajax.BeginForm(
    Model.FormModel.Action,                                // actionName
    Model.FormModel.Controller,                            // controllerName
    Model.FormModel.RouteValues,                           // routeValues
    new AjaxOptions {                                      // ajaxOptions
        HttpMethod = "Post",
        InsertionMode = System.Web.Mvc.Ajax.InsertionMode.Replace,
        UpdateTargetId = "WindowContent",
    }, 
    new Dictionary<string, object> { { "id", FormId } })    // htmlAttributes
) { %>
    <input name="submit" type="submit" class="button" value="" style="float: right;"/>
<% } %>

Заметили правильную перегрузку? Вы использовали тот, который принимал routeValues и htmlAttributes в качестве анонимных объектов, за исключением того, что вы передавали Model.FormModel.RouteValues как RouteValueDictionary, что в основном снимало вашу перегрузку.

Нажмите F12 при наведении курсора на BeginForm, и, если вам повезет, и Intellisense отлично сработает для вас в представлениях Razor (что случается редко), вы будете перенаправлены на метод, которым вы на самом деле являетесь призывая и осознавая свою ошибку.

...