Как сделать привязку сложной модели с помощью вспомогательных функций в MVC3? - PullRequest
1 голос
/ 03 апреля 2012

У меня есть сложная модель, которую я передаю своему виду, и она хорошо работает для отображения, но как только я передаю ее обратно, она становится нулевой.Моя модель выглядит следующим образом:

public class LeavingShopSetupViewModel
{
    public LeavingShopSetupViewModel()
    {

    }
    ...Additional constructor here....

    public BasicSetupAccessor BasicSetupAccessor { get; set; }

    public SetupAcessor SetupAcessor { get; set; }

    public FrontSuspensionAccessor FrontSuspensionAcessor { get; set; }

    public RearSuspensionAccessor RearSuspensionAccessor { get; set; }

    public BrakeAccessor BrakeAccessor { get; set; }

    public void SaveSetup()
    {
        ...Save code.....
    }
}

Каждый из объектов состоит из простых объектов, таких как двойные числа, строки, целые числа ...

На мой взгляд, следующий с кодом javascript

@using RIS.Models.EventModels
@model LeavingShopSetupViewModel
<script type="text/javascript">
    $(function() {
        $("#submit_btn").click(function() {
            var form = $('#setupForm');
            $.ajax({
                type: 'post',
                url: "@Url.Action("SaveSetup","Events")",
                data: form.serialize()
            });
            return false; // <-- cancel the default event
        });

    });
</script>
<form id="setupForm">
    <fieldset>
        <legend>Leaving Shop Setup</legend>
        <div class="row-fluid">
            <div class="span4">
                ...Boilerplate code.....
                @BuildSheetHelpers.DoubleTextBox("FARB Link Length", Model.BasicSetupAccessor.SwayBarLinkLengthLF, Model.BasicSetupAccessor.SwayBarLinkLengthLR)
                @BuildSheetHelpers.DoubleTextBox("Bump Stop Gap", Model.BasicSetupAccessor.BumpStopGapL, Model.BasicSetupAccessor.BumpStopGapR)
                @BuildSheetHelpers.DoubleTextBox("Total BS Height", Model.BasicSetupAccessor.BumpRubberHeightTotalL, Model.BasicSetupAccessor.BumpRubberHeightTotalR)
            ...plenty more code that is all similar to this.....
            </div>
        </div>
    </fieldset>
    <a class="btn btn-primary" id="submit_btn">Save Setup</a>

    @Html.HiddenFor(model => model.SetupAcessor)
    @Html.HiddenFor(model => model.BasicSetupAccessor)
    @Html.HiddenFor(model => model.BrakeAccessor)
    @Html.HiddenFor(model => model.FrontSuspensionAcessor)
    @Html.HiddenFor(model => model.RearSuspensionAccessor)
</form>

А моя вспомогательная функция выглядит следующим образом:

@helper DoubleTextBox(string displayTag, double? left, double? right)
{
    <div class="row-fluid form-inline">
        <input type="text" class="span4 data" value="@left"/>
        <label  class="span4 pagination-centered">@displayTag</label>
        <input type="text" class="span4 data" value="@right"/>
    </div>
}

Действие SaveSetup просто

public ActionResult SaveSetup(LeavingShopSetupViewModel setup)
    {
        setup.SaveSetup();
        return null;
    }

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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2012

Я понял это с некоторой модификацией моей вспомогательной функции, включив имя и идентификатор, чтобы jquery.serialize () правильно сериализовал свойства. Мне также нужно написать несложную модель представления, и некоторые универсальные методы для вспомогательной функции заставляют все это работать хорошо. Этот код ниже для дальнейшего использования. Информация об общих вспомогательных функциях была найдена здесь в stackoverflow

@functions
{
    public static HelperResult DoubleTextBox<T>(T targeObject, string label, Expression<Func<T, double?>> leftTarget, Expression<Func<T, double?>> rightTarget) 
    { 
        var leftExpr = (MemberExpression)leftTarget.Body; 
        var leftProp = (PropertyInfo)leftExpr.Member; 
        var leftValue = leftProp.GetValue(targeObject, null);
        var rightExpr = (MemberExpression)rightTarget.Body; 
        var rightProp = (PropertyInfo)rightExpr.Member; 
        var rightValue = rightProp.GetValue(targeObject, null);

        return DoubleTextBox(label, leftValue, leftProp.Name, rightValue, rightProp.Name);
    } 
}
@helper DoubleTextBox(string displayTag, object leftValue, string leftName, object rightValue, string rightName)
{    
    <div class="row-fluid form-inline">
        <input type="text" class="span4 data" value="@leftValue" id="@leftName" name="@leftName"/>
        <label  class="span4 pagination-centered">@displayTag</label>
        <input type="text" class="span4 data" value="@rightValue" id="@rightName" name="@rightName"/>
    </div>
}
0 голосов
/ 03 апреля 2012

На основании ваших комментариев я бы рекомендовал заменить ваших помощников на EditorTemplates.Шаблоны редактора - это частичные представления, которые используются с помощником @Html.EditorFor().

В этом вопросе рекомендует блог Брэда Уилсона после обучения.Он не использует Razor, но все остальное то же самое для MVC3.

Таким образом, вы должны определить шаблон EditorTemplate для каждого типа, который необходимо отобразить, а затем заменить все скрытые значения на редакторы:

@Html.EditorFor(model => model.SetupAcessor)
@Html.EditorFor(model => model.BasicSetupAccessor)
@Html.EditorFor(model => model.BrakeAccessor)
@Html.EditorFor(model => model.FrontSuspensionAcessor)
@Html.EditorFor(model => model.RearSuspensionAccessor)

Кроме того, в форме много скрытых полей.Возможно, вы захотите сохранить эти значения на стороне сервера вместо SQL / Cache / Session / etc.

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