2012-02-22 25 views
0

我有一个视图,有几个局部视图可以绑定到我的模型。出于某种原因,当我发布时,模型是空的,我不知道为什么。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 SimpleSearchCriteria { get; set; } 
    public string CustomerNumberCriteria { get; set; } 
    public string AccountNumberCriteria { get; set; } 
    public string NameCriteria { get; set; } 
    public string PhoneNumberCriteria { get; set; } 
} 

这是我的控制器。我正在填充视图模型的所有值,因为我想查看这些值是否属于部分视图。他们确实到达那里,所以我只是在帖子中说我有问题。

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局部视图。我想如果我能得到这个工作,另一个将遵循相同的路径。我在部分文章中做文章,并使用jQuery来完成。我不确定这些事情是否会引起我的问​​题。我只有那里所有的隐藏物品,因为我不知道是否有他们造成我的问题。

@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> 
} 

这里正在浏览的简单的搜索局部视图时的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> 

我该如何解决这个问题?

回答

0

我曾明确地试图在模型发送到没有运气的谐音。我相信部分视图默认情况下会获得父模型,如果没有指定任何内容,那么我需要做的就是在我的部分中指定模型类型,并且我得到了信息。

我终于想通了很多尝试和错误。我的问题是由于我试图使用jQuery做一个帖子而引起的。你需要做一些其他的事情来更新你的模型,这样做。一旦我改变了它,并在表单上放置了一个输入控件,我从控制器的父视图和部分视图中获取了所有数据。

1

尽管您选择了部分渲染,但您并未将其传递给模型。还有的Html.Partial一个重载版本需要,使您可以通过一个模型给它的第二个参数:

@Html.Partial("ViewName", Model); 

所以你的情况,你会使用这样的:

@if ((Model.AdvancedSearchOption && Model.ForceSimple != true) || Model.ForceAdvanced == true) 
{ 
    @Html.Partial("AdvancedSearch", Model) 
} 
else 
{ 
    @Html.Partial("SimpleSearch", Model) 
} 

还要注意如何我我已经删除了@,你在前加Model。为了更好地理解为什么,请参阅Introduction to ASP.NET Web Programming Using the Razor Syntax和Phil Haack编写的同一主题的小参考文献here

1

我认为@ 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)  
}