我有一个可以编辑的表单视图。观点比较复杂。该表格用于合同。合同名称可以在顶部进行编辑。一份合同有很多广告,每个广告的详细信息都可以编辑。表格的长度取决于合同有多少广告。我在视图中有一个 for 循环,显示每个广告的所有表单字段。
此外,模型中有一些字段用于确定某些广告详细信息,但它们本身不应保存到数据库中(但它们必须在视图中显示为下拉菜单)。
此外,有些模型字段不需要出现在视图中,但在 POST 控制器方法中需要以正确保存数据库(我正在手动保存),因此它们必须以某种方式通过视图并且传回控制器。这是我的模型:
public class ModContract
{
public int contract_id; // pk; needed
public string contract_name { get; set; } // save
public List<ModAds> ads { get; set; }
}
public class ModAds
{
public int contr_ad_id; // pk; needed
public string name { get; set; } // save
public string print_product_id { get; set; } // used for product_name
public string product_name { get; set; } // appear
public string print_ad_option_id { get; set; } // save
public string adv_product { get; set; } // appear
public List<string> editions { get; set; } // save
public double freq_disc { get; set; } // save
public double other_dis_dol { get; set; } // save
public double? other_dis_per { get; set; } // save
public string non_cash_note { get; set; } // save
public double non_cash_cons { get; set; } // save
}
后面带有“保存”注释的字段应保存到数据库中。带有“出现”的必须在视图中,但在 POST 控制器方法中不需要。POST 控制器方法中需要带有“需要”的那些,但视图中不需要。
顺便说一句,这些模型类不会与数据库表进行一对一的映射,它们是由几个不同的表组成的。
据我所知,我不知道如何让模型绑定与它一起工作。例如,传回控制器的模型对于 ModContract 的 ads 字段有一个空值。我想知道如何在不依赖模型绑定的情况下手动将视图中的内容传递回控制器。
我知道我可能会将@Html.HiddenFor 用于POST 方法中所需的ID,但不是视图,但由于某种原因,当我使用contract_id 和_name 尝试它时,它不起作用。
<li data-role="fieldcontain">
<label>Contract Name</label>
@Html.HiddenFor(m => m.contract_id)
@Html.EditorFor(m => m.contract_name)
</li>
在 POST 方法中返回的 contract_id 为 0。
让我知道我的问题是否听起来很愚蠢,因为这是不可能的,或者因为我把事情复杂化了,我对这一切都很陌生。
提前致谢!
编辑
这是视图。我无法正确缩进,但希望它是可读的。
@model oulookmediaweb.Models.ModContract
@{
ViewBag.Title = "ModifyContract";
}
@{
var num = 1;
}
<h2>Modify Contract</h2>
@using (Html.BeginForm("ModifyContract", "Contract", FormMethod.Post, htmlAttributes: new { data_ajax = "false" }))
{
@Html.ValidationSummary();
<ul data-role="listview" data-inset="true">
<li data-role="fieldcontain">
<label>Contract Name</label>
@Html.HiddenFor(m => m.contract_id)
@Html.EditorFor(m => m.contract_name)
</li>
</ul>
<div>
@foreach (var ad in Model.ads)
{
<div id="@num">
<ul data-role="listview" data-inset="true">
<li data-role="list-divider">@ad.name</li>
<li data-role="fieldcontain">
<label><strong>Product Name</strong></label>
<div>@ad.product_name</div>
<div id="@num-drdn0" hidden="true">@Html.DropDownListFor(m => ad.print_product_id, ViewData["products_list"] as SelectList)</div>
<input id="@num-editbutton" type="button" onclick="edit(@num)" value="Edit" />
</li>
<li data-role="fieldcontain">
<label><strong>Advertising Product</strong></label>
<div>@ad.adv_product</div>
<div id="@num-drdn1" class="hid">
<select></select>
</div>
</li>
<li data-role="fieldcontain">
<label><strong>Editions to run in:</strong></label>
@foreach (var ed in ad.editions)
{
<div>@ed</div>
}
<div id="@num-drdn2" class="hid">
<select multiple="multiple" data-native-menu="false"></select>
</div>
</li>
<li data-role="fieldcontain">
<label><strong>Frequency Discount (%)</strong></label>
<div>@Html.EditorFor(m => ad.freq_disc)</div>
</li>
<li data-role="fieldcontain">
<label><strong>Other Discount ($)</strong></label>
<div>@Html.EditorFor(m => ad.other_dis_dol)</div>
</li>
<li data-role="fieldcontain">
<label><strong>Other Discount (%)</strong></label>
<div>@Html.EditorFor(m => ad.other_dis_per)</div>
</li>
<li data-role="fieldcontain">
<label><strong>Non Cash Note</strong></label>
<div>@Html.EditorFor(m => ad.non_cash_note)</div>
</li>
<li data-role="fieldcontain">
<label><strong>Non Cash Consideration</strong></label>
<div>@Html.EditorFor(m => ad.non_cash_cons)</div>
</li>
</ul>
@{num++;}
</div>
}
</div>
<ul data-role="listview" data-inset="true">
<li data-role="fieldcontain">
<input type="submit" data-theme="e" value="Submit" />
</li>
</ul>
}
<script type="text/javascript">
var nu;
window.onload = function () {
// hide adv prods and editions select for now
$(".hid select").closest('.ui-select').hide();
}
// called when the edit button for product is clicked
function edit(num) {
nu = num;
$("#" + nu + "-drdn0").show(); // show dropdown
$("#" + nu + "-editbutton").closest('.ui-btn').hide(); // hide edit button; '.ui-btn'? WTF?
// remove current product selection div
// remove adv product selection div
// remove editions div
$("#" + nu + "-drdn0 select").change(prodChange); // on select change
$("#" + nu + "-drdn0 select").trigger("change"); // trigger for default; happens twice; WHY?
}
// called when a magazine is selected
function prodChange() {
// ajax
var url = '@Url.Action("GetAdvProdList", "Contract")' + '?prod_id=' + this.value;
$.getJSON(url, null, function (list) {
// for adv list dropdown
$("#" + nu + "-drdn1 select").empty(); // remove old stuff
$("#" + nu + "-drdn1 select").closest('.ui-select').show(); // show dropdown
var arr = list.advlist; // get the array from object
$.each(arr, function (ind, val) {
// add each item in list as an option of select
$("#" + nu + "-drdn1 select").append('<option value=' + val.Value + '>' + val.Text + '</option>');
});
$("#" + nu + "-drdn1 select").selectmenu('refresh', true); // refresh menu
// for ed list
$("#" + nu + "-drdn2 select").empty(); // remove old stuff
$("#" + nu + "-drdn2 select").closest('.ui-select').show(); // show list
var lis = list.edlist; // get the array from object
$.each(lis, function (ind, val) {
// add each item to list
$("#" + nu + "-drdn2 select").append('<option value=' + val.Value + '>' + val.Text + '</option>');
});
$("#" + nu + "-drdn2 select").selectmenu('refresh', true); // refresh menu
});
}