Asp.net mvc 3 ASP.NET MVC 3模型没有回发信息
我有一个视图,其中有几个局部视图绑定到我的模型。出于某种原因,当我发布时,模型是空的,我不知道为什么 下面是我的ViewModelAsp.net mvc 3 ASP.NET MVC 3模型没有回发信息,asp.net-mvc-3,Asp.net Mvc 3,我有一个视图,其中有几个局部视图绑定到我的模型。出于某种原因,当我发布时,模型是空的,我不知道为什么 下面是我的ViewModel public class IndexViewModel { public bool AdvancedSearchOption { get; set; } public bool ForceAdvanced { get; set; } public bool ForceSimple { get; set; } public string
public class IndexViewModel
{
public bool AdvancedSearchOption { get; set; }
public bool ForceAdvanced { get; set; }
public bool ForceSimple { get; set; }
public string SimpleSearchCriteria { get; set; }
public string CustomerNumberCriteria { get; set; }
public string AccountNumberCriteria { get; set; }
public string NameCriteria { get; set; }
public string PhoneNumberCriteria { get; set; }
}
这是我的控制器。我正在填充viewmodel的所有值,因为我想看看这些值是否到达局部视图。他们确实到达了那里,所以我只是在帖子上遇到了问题
public class HomeController : Controller
{
private ISecurityRepository SecurityRep;
public HomeController(ISecurityRepository repo)
{
SecurityRep = repo;
}
public ActionResult Index()
{
IndexViewModel temp = new IndexViewModel();
temp.AdvancedSearchOption = SecurityRep.DefaultToAdvancedSearch(User.Identity.Name);
temp.ForceAdvanced = false;
temp.ForceSimple = false;
temp.SimpleSearchCriteria = "Testing";
temp.AccountNumberCriteria = "Acct";
temp.CustomerNumberCriteria = "Cust";
temp.NameCriteria = "Name";
temp.PhoneNumberCriteria = "Phone";
return View(temp);
}
public ActionResult SimpleSearch()
{
IndexViewModel temp = new IndexViewModel();
temp.AdvancedSearchOption = SecurityRep.DefaultToAdvancedSearch(User.Identity.Name);
temp.ForceAdvanced = false;
temp.ForceSimple = true;
temp.SimpleSearchCriteria = "Testing";
temp.AccountNumberCriteria = "Acct";
temp.CustomerNumberCriteria = "Cust";
temp.NameCriteria = "Name";
temp.PhoneNumberCriteria = "Phone";
return View("Index",temp);
}
public ActionResult AdvancedSearch()
{
IndexViewModel temp = new IndexViewModel();
temp.AdvancedSearchOption = SecurityRep.DefaultToAdvancedSearch(User.Identity.Name);
temp.ForceAdvanced = true;
temp.ForceSimple = false;
temp.SimpleSearchCriteria = "Testing";
temp.AccountNumberCriteria= "Acct";
temp.CustomerNumberCriteria= "Cust";
temp.NameCriteria= "Name";
temp.PhoneNumberCriteria = "Phone";
return View("Index", temp);
}
[HttpPost]
public ActionResult Index(IndexViewModel vm, FormCollection formCollection)
{
return View();
}
}
这是我的看法
@model TRIOSoftware.Magnum.Models.IndexViewModel
@{
ViewBag.Title = "Search";
}
@if ((@Model.AdvancedSearchOption && @Model.ForceSimple != true) || @Model.ForceAdvanced == true)
{
@Html.Partial("AdvancedSearch")
}
else
{
@Html.Partial("SimpleSearch")
}
这是我的SimpleSearch
局部视图。我想,如果我能让这一个工作,另一个将遵循同样的路径。我在部分中做文章,我经常这样做。我不确定这些事情是否会给我带来麻烦。我只有所有隐藏的项目在那里,因为我不知道如果没有他们是造成我的问题
@model TRIOSoftware.Magnum.Models.IndexViewModel
<script type="text/javascript">
$(document).ready(function () {
$("#DefaultDiv").find("#DefaultAdvanced").click(function () {
$.post("DefaultSimple");
});
$("#SearchSection").find("#SearchButton").click(function () {
$.post("");
});
});
</script>
@using (Html.BeginForm("Index","Home"))
{
@Html.HiddenFor(m => m.ForceAdvanced)
@Html.HiddenFor(m => m.AdvancedSearchOption)
@Html.HiddenFor(m => m.ForceSimple)
@Html.HiddenFor(m => m.AccountNumberCriteria)
@Html.HiddenFor(m => m.CustomerNumberCriteria)
@Html.HiddenFor(m => m.NameCriteria)
@Html.HiddenFor(m => m.PhoneNumberCriteria)
<div id="DefaultDiv" style="float:right">
<a id="DefaultAdvanced" href="#" class="ButtonClass">Default Simple Search</a>
</div>
<div style="clear:both; margin: auto; width: 800px">
<img src="../../Content/images/TRIO_transparent_image.gif"; alt="TRIO Software"; style="margin-left:150px; clear:left"/>
<div style="clear:left; float: left" class="SearchText">
@Html.Label("What's your inquiry?:")
@Html.EditorFor(m => m.SimpleSearchCriteria, new { style = "width: 400px" })
</div>
<div id="SearchSection" style="float: left" class="SearchText">
<a href="#"; id="SearchButton" class="ButtonClass"><img src="../../Content/images/Search.gif"; alt="Search"; style="float:left" /></a>
</div>
<p style="clear:left;margin-left:400px">
@Html.ActionLink("Advanced Search", "AdvancedSearch", null, new { style = "clear:left" })
</p>
</div>
}
@model TRIOSoftware.Magnum.Models.IndexViewModel
$(文档).ready(函数(){
$(“#DefaultDiv”)。查找(“#DefaultAdvanced”)。单击(函数(){
美元邮政(“DefaultSimple”);
});
$(“搜索部分”)。查找(“搜索按钮”)。单击(函数(){
$邮政编码(“”);
});
});
@使用(Html.BeginForm(“索引”、“主页”))
{
@Html.HiddenFor(m=>m.ForceAdvanced)
@Html.HiddenFor(m=>m.AdvancedSearchOption)
@HiddenFor(m=>m.ForceSimple)
@HiddenFor(m=>m.AccountNumberCriteria)
@Html.HiddenFor(m=>m.CustomerNumber标准)
@Html.HiddenFor(m=>m.NameCriteria)
@HiddenFor(m=>m.PhoneNumberCriteria)
@Label(“您的查询是什么?:”)
@EditorFor(m=>m.SimpleSearchCriteria,新的{style=“width:400px”})
@ActionLink(“高级搜索”,“高级搜索”,null,新{style=“clear:left”})
}
以下是查看简单搜索部分视图时的HTML代码:
<div id="main">
<script type="text/javascript">
$(document).ready(function () {
$("#DefaultDiv").find("#DefaultAdvanced").click(function () {
$.post("DefaultSimple");
});
$("#SearchSection").find("#SearchButton").click(function () {
$.post("");
});
});
</script>
<form method="post" action="/">
<input type="hidden" value="False" name="ForceAdvanced" id="ForceAdvanced" data-val-required="The ForceAdvanced field is required." data-val="true">
<input type="hidden" value="False" name="AdvancedSearchOption" id="AdvancedSearchOption" data-val-required="The AdvancedSearchOption field is required." data-val="true">
<input type="hidden" value="False" name="ForceSimple" id="ForceSimple" data-val-required="The ForceSimple field is required." data-val="true">
<input type="hidden" value="Acct" name="AccountNumberCriteria" id="AccountNumberCriteria">
<input type="hidden" value="Cust" name="CustomerNumberCriteria" id="CustomerNumberCriteria">
<input type="hidden" value="Name" name="NameCriteria" id="NameCriteria">
<input type="hidden" value="Phone" name="PhoneNumberCriteria" id="PhoneNumberCriteria">
<div style="float:right" id="DefaultDiv">
<a class="ButtonClass ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" href="#" id="DefaultAdvanced" role="button"><span class="ui-button-text">Default Simple Search</span></a>
</div>
<div style="clear:both; margin: auto; width: 800px">
<img style="margin-left:150px; clear:left" alt="TRIO Software" ;="" src="../../Content/images/TRIO_transparent_image.gif">
<div class="SearchText" style="clear:left; float: left">
<label for="What_s_your_inquiry_:">What's your inquiry?:</label>
<input type="text" value="Testing" name="SimpleSearchCriteria" id="SimpleSearchCriteria" class="text-box single-line">
</div>
<div class="SearchText" style="float: left" id="SearchSection">
<a class="ButtonClass ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" id="SearchButton" ;="" href="#" role="button"><span class="ui-button-text"><img style="float:left" alt="Search" ;="" src="../../Content/images/Search.gif"></span></a>
</div>
<p style="clear:left;margin-left:400px">
<a style="clear:left" href="/Home/AdvancedSearch">Advanced Search</a>
</p>
</div>
</form>
</div>
$(文档).ready(函数(){
$(“#DefaultDiv”)。查找(“#DefaultAdvanced”)。单击(函数(){
美元邮政(“DefaultSimple”);
});
$(“搜索部分”)。查找(“搜索按钮”)。单击(函数(){
$邮政编码(“”);
});
});
你的询问是什么
如何解决此问题?尽管选择了要渲染的部分,但没有将其传递给模型。有一个重载版本的
Html.Partial
,它接受第二个参数,允许您向其传递模型:
@Html.Partial("ViewName", Model);
因此,在您的情况下,您可以使用以下方法:
@if ((Model.AdvancedSearchOption && Model.ForceSimple != true) || Model.ForceAdvanced == true)
{
@Html.Partial("AdvancedSearch", Model)
}
else
{
@Html.Partial("SimpleSearch", Model)
}
还请注意我是如何删除您在
模型
前面加前缀的@
的。为了更好地理解原因,请参阅菲尔·哈克(Phil Haack)为同一主题撰写的一篇小参考文献。我认为@john-h的答案一针见血。但是,您可能希望降低为自己创建的复杂性
1) 因为ForceSimple和ForceAdvanced都是布尔值,所以假设ForceAdvanced为true,那么它就不是“简单”的,对吗?我不确定你还有什么其他的逻辑
2) 与其创建两个视图并“发布”回以获得正确的视图,为什么不使用一个参数来设置搜索类型呢?或者评估安全性以设置用户可以执行的安全性。下面是一个例子:
控制器操作:
//id is the search type: true is Advanced
public ActionResult Search(bool id) {
IndexViewModel viewModel = new IndexViewModel {
/* Do whatever logic here */
ForceAdvanced = (id) ? false : true,
AdvancedSearchOption = id
};
return View("search", viewModel);
}
[HttpPost]
public ActionResult Search(IndexViewModel model) {
//model.SimpleSearchCriteria = "Testing";
//model.PhoneNumberCriteria = "Phone";
return View("search", model);
}
搜索视图:
@using (@Html.BeginForm(new { id = @Model.AdvancedSearchOption })) {
<div style="clear:left; float: left" class="SearchText">
@Html.Label("What's your inquiry?:")
@if (Model.AdvancedSearchOption) {
<div>
@* if you really want, load your partial views here *@
<span>@Html.LabelFor(m => m.NameCriteria)</span>
@Html.EditorFor(m => m.NameCriteria, new { style = "width: 400px" })
<span>@Html.LabelFor(m => m.PhoneNumberCriteria)</span>
@Html.EditorFor(m => m.PhoneNumberCriteria, new { style = "width: 400px" })
</div>
}
else {
@* if you really want, load your partial views here *@
@Html.EditorFor(m => m.SimpleSearchCriteria, new { style = "width: 400px" })
}
</div>
<div>
<input type="submit" value="Search" />
</div>
@Html.HiddenFor(m => m.ForceAdvanced)
@Html.HiddenFor(m => m.AdvancedSearchOption)
@Html.HiddenFor(m => m.ForceSimple)
@Html.HiddenFor(m => m.AccountNumberCriteria)
@Html.HiddenFor(m => m.CustomerNumberCriteria)
@Html.HiddenFor(m => m.NameCriteria)
@Html.HiddenFor(m => m.PhoneNumberCriteria)
}
@使用(@Html.BeginForm(新的{id=@Model.AdvancedSearchOption})){
@Label(“您的查询是什么?:”)
@if(型号AdvancedSearchOption){
@*如果确实需要,请在此处加载局部视图*@
@LabelFor(m=>m.NameCriteria)
@EditorFor(m=>m.NameCriteria,新的{style=“width:400px”})
@LabelFor(m=>m.PhoneNumberCriteria)
@EditorFor(m=>m.PhoneNumberCriteria,新的{style=“width:400px”})
}
否则{
@*如果确实需要,请在此处加载局部视图*@
@EditorFor(m=>m.SimpleSearchCriteria,新的{style=“width:400px”})
}
@Html.HiddenFor(m=>m.ForceAdvanced)
@Html.HiddenFor(m=>m.AdvancedSearchOption)
@HiddenFor(m=>m.ForceSimple)
@HiddenFor(m=>m.AccountNumberCriteria)
@Html.HiddenFor(m=>m.CustomerNumber标准)
@Html.HiddenFor(m=>m.NameCriteria)
@HiddenFor(m=>m.PhoneNumberCriteria)
}
我曾尝试将模型显式地发送到partials,但没有成功。我相信,如果没有指定任何内容,局部视图在默认情况下会获得父模型,因此我所需要做的就是在局部视图中指定模型类型,然后我就得到了信息
经过反复试验,我终于找到了答案。我的问题是由我试图使用做一个职位引起的。必须做一些其他的事情来更新模型,这样做。一旦我更改了它,并在表单上放置了一个用于发布的输入控件,我就从控制器中的父视图和部分视图获取了所有数据