1

我确信这已经在某个地方的某个地方得到了回答,但是经过一个多小时的寻找,我还是找不到它。

我正在使用 C#、MVC3 和 AJAX/jQuery。

我有一个名为 FormulaModel 的自定义对象,它有一些属性和一个变量列表。在该变量列表中是一个类别和一个选项对列表。在该 OptionPairs 列表中是一个由名称和值组成的 OptionPair。

我有一个显示公式的部分视图,以及一个用于变量和选项对的 EditorTemplate。

一切都按预期显示,带有选项对值的文本框。但是,在提交包含部分视图的表单后,我没有得到变量内的 OptionPairs 列表。FormCollection 显示这些值的格式看起来是正确的,但模型不包含 OptionPairs 列表。我究竟做错了什么?我是否忽略了一些愚蠢的事情,或者试图做一些比常规数据绑定可以处理的更复杂的事情?

非常感谢您的帮助!

为了简洁起见,我将剪掉一些标准的东西。

--- 公式.cs ---

public int formulaId { get; set; }
public string name { get; set; }
public string formulaCypher { get; set; }
public System.DateTime dateCreated { get; set; }
public bool isActive { get; set; }

--- 公式变量.cs ---

[Serializable]
public class FormulaVariable
{
    public string Category { get; set; }
    public List<OptionPair> Options;
}

--- OptionPair.cs ---

[Serializable]
public class OptionPair
{
    public string OptionName { get; set; }
    public int Value { get; set; }
}

--- 公式模型.cs ---

private Formula _formula;
public List<FormulaVariable> Variables { get; set; }
public Formula MyFormula
{
    get { return _formula; }
    set { _formula = value; }
}

public void DecodeFormula()
{
    this.VariableList = this.DecodeFormula(this._formula.formulaCypher);
}

public void EncodeFormula()
{
    _formula.formulaCypher = EncodeFormula(this.VariableList);
}

--- EditFormula.cshtml ---

@model Models.FormulaModel
@using (Ajax.BeginForm("SaveFormula", "Management", new { area = "Admin" }, null, new { id = "frmManageFormula" }))
{
@Html.HiddenFor(x => x.MyFormula.dateCreated)
@Html.HiddenFor(x => x.MyFormula.dateEdited)
@Html.HiddenFor(x => x.MyFormula.dateEnacted)
@Html.HiddenFor(x => x.MyFormula.dateRetired)
@Html.HiddenFor(x => x.MyFormula.dealerId)
@Html.HiddenFor(x => x.MyFormula.formulaId)
@Html.HiddenFor(x => x.MyFormula.isActive)
@Html.HiddenFor(x => x.MyFormula.name)

<table style="border: 0; padding: 2px; border-spacing: 2px;">
    <thead>
        <tr>
            <th colspan="2">
                Formula "@Model.MyFormula.name" 
            </th>
        </tr>
    </thead>
    <tbody>
        @Html.EditorFor(x => x.Variables)
        <tr>
            <td colspan="2">
                <input type="button" id="btnSaveFormula" value="Save" />
            </td>
        </tr>
    </tbody>
</table>
}

--- 公式变量.cshtml ---

@model Models.FormulaVariable
<tr>
    <td colspan="2" style="border: 1px solid #000000;">
        @Model.Category
        @Html.HiddenFor(x => x.Category)        
    </td>
</tr>
@Html.EditorFor(x => x.Options)

--- OptionPair.cshtml ---

@model Models.OptionPair
<tr>
    <td>
        @Model.OptionName
        @Html.HiddenFor(x => x.OptionName)
    </td>
    <td>
        @Html.TextBoxFor(x => x.Value, new { style = "width: 75px;" })        
    </td>
</tr>

--- jQuery ---

$("#btnSaveFormula").click(function btnSaveFormula_Click(e) {
    $.ajax({
        type: 'POST',
        url: $("#frmManageFormula").attr("action"),
        data: $("#frmManageFormula").serialize(),
        success: function (content) {
            alert(content);
        },
        error: function (xhr, status) {
            alert(xhr.responseText);
        }
    });
});

--- 控制器方法 ----

[HttpPost]
public ActionResult SaveFormula(FormulaModel model, FormCollection formFields)
{
    string errorMsg = string.Empty;
    try
    {   
        model.EncodeFormula();
        errorMsg = model.SaveFormulaCypher();
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return Json(errorMsg);
}

---点击视图前的模型---

击中视图前的模型

--- 回来后的模型 ---

回来后的模型

--- 回来后的FormCollection ---

返回后的FormCollection

再次感谢您提供的任何帮助!

4

0 回答 0