Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC局部视图问题_C#_Ajax_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# MVC局部视图问题

C# MVC局部视图问题,c#,ajax,asp.net-mvc,asp.net-mvc-4,C#,Ajax,Asp.net Mvc,Asp.net Mvc 4,我是MVC的新手,我正在尝试找出是否有更好的方法来做到这一点。我有一个文本框供用户在搜索中输入,然后基于该搜索,我在所述搜索框下方显示一些结果。我试图避免在我看来有这么多的代码逻辑,我想知道是否有更好的方法来处理这个问题。这是我现有的代码,根据“Model.Results”的值,如果其余逻辑通过,它将返回3个局部视图中的一个或一个按钮: @section CustomerPrefixInfo { @if (Model.Results == PrefixSearch.SearchResul

我是MVC的新手,我正在尝试找出是否有更好的方法来做到这一点。我有一个文本框供用户在搜索中输入,然后基于该搜索,我在所述搜索框下方显示一些结果。我试图避免在我看来有这么多的代码逻辑,我想知道是否有更好的方法来处理这个问题。这是我现有的代码,根据“Model.Results”的值,如果其余逻辑通过,它将返回3个局部视图中的一个或一个按钮:

@section CustomerPrefixInfo
{
    @if (Model.Results == PrefixSearch.SearchResults.CustomerFound)
    {
        @Html.Partial("_CustomerPrefixInfo")
    }
    @if (Model.Results == PrefixSearch.SearchResults.PrefixResultsFound)
    {
        @Html.Partial("_PrefixResults")
    }
    @if (Model.Results == PrefixSearch.SearchResults.AnimalsFound)
    {
        @Html.Partial("_AnimalSearchResults")
    }
    @if (Model.Results == PrefixSearch.SearchResults.ValidNewPrefix)
    {
        using (Html.BeginForm("Index", "PrefixManagement", new { prefix = Model.AnimalPrefix.Prefix, dbPrefix = Model.AnimalPrefix.DbPrefix }))
        {
            <fieldset>
                <input id="btnReservePrefix" type="submit" value="Reserve Prefix" />
            </fieldset>
        }
    }
}
但当我尝试这一点时,它将部分视图放到了一个新页面上

这是我的一个局部视图(它们都是3个基本相同的视图)

@model MVC\u Test\u Project.Models.PrefixSearch
@{
ViewBag.Title=“PrefixResults”;
}
@{
布局=空;
}
@Html.DisplayNameFor(model=>model.PrefixResults[0].Prefix)
@DisplayNameFor(model=>model.PrefixResults[0].CustomerCount)
@DisplayNameFor(model=>model.PrefixResults[0].Link)
@foreach(Model.PrefixResults中的变量项)
{
@DisplayFor(modelItem=>item.Prefix)
@DisplayFor(modelItem=>item.CustomerCount)
}
任何帮助都将不胜感激

编辑这只是一个有用的提示,如果有人犯了我犯过的同样愚蠢的错误,请确保在脚本之前调用您的包

@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/bootstrap")
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.min.js"></script>
@Styles.Render(“~/Content/css”)
@Scripts.Render(“~/bundles/modernizer”)
@Scripts.Render(“~/bundles/jquery”)
@Scripts.Render(“~/bundles/jqueryval”)
@Scripts.Render(“~/bundles/bootstrap”)
当提到要使用这些代码时,我已经添加了最后两行代码,但是它们在我的包之上……因此ajax无法工作。谢谢大家的帮助,一切都好了!
--Joseph

确保在要执行ajax的页面顶部包含jQuery和
jQuery.unobtrusive ajax.js
(或
jQuery.unobtrusive ajax.min.js

像这样:

<script src="~/scripts/jquery-1.x.x.js" />
<script src="~/scripts/jquery.unobtrusive-ajax.js" />

...
The rest of your page down here
...
然后Ajax将返回部分视图,并将内容放入
searchResults
div中

编辑2

我注意到在您的
Ajax.BeginForm
AjaxOptions
对象中缺少
HttpMethod=“POST”

AjaxOptions
应该如下所示:

new AjaxOptions {
            HttpMethod = "POST",
            UpdateTargetId = "searchResults",
            InsertionMode = InsertionMode.Replace
}
我想把它放在一个控制器中,这样它就可以返回视图

看起来很直截了当:

视图模型:

public class MyModel
{
  public string PageToRender { get; set; }
}
控制器动作

public ActionResult DoLogic()
{
  //var Results = ?? as The ENum

  switch(Results)
  {
    PrefixSearch.SearchResults.CustomerFound:
      model.PageToRender = "_CustomerPrefixInfo";
    // etc etc
  }    

  return View(model);
}
视图:

虽然我可能会装饰枚举:

public enum SearchResults
{
  [Display(Name="_CustomerPrefixInfo")]
  CustomerFound
}

然后没有switch语句,你只是。

你能显示你的部分视图代码吗,它应该在顶部有一个
@{Layout=null;}
用来告诉你,不要使用itI的任何母版页。我只是将@{Layout=null;}添加到我的部分视图中,结果似乎没有改变。我更新了我的帖子以显示我的一个视图。您是否希望只在页面上的一个表中返回结果?返回的局部视图是否只是当前结果的附加部分?如果是这种情况,您需要
InsertionMode.Replace
,它只会重新呈现
搜索结果
div确保控制器中的操作方法上方有
[HttpPost]
属性。另外,如果您只是“搜索”结果,而不是实际“发布”任何内容,我建议您使用
GET
请求(操作方法上方不需要属性),并将
FormMethod
更改为
GET
,或者尝试将
AjaxOptions
中的
HttpMethod
设置为
“GET”
@jpaugh78为什么要使用ajax来实现这一点。它似乎不能解决你的具体问题。这是一项很酷的技术,我经常做你想做的事情,但对于你的特殊需求来说,这似乎有些过头了。这并没有回答如何切换逻辑的问题。不管html是如何呈现的,他仍然希望视图中没有逻辑。如果你正确阅读了文章,他在动作代码中加入了逻辑,这决定了返回哪个部分视图……我编辑了我的答案,以澄清逻辑可以在哪里,以及如何在返回部分视图的页面上显示这一点。很高兴听到您有所进展:)在您使用的AjaxOptions对象属性中,我总是使用一个东西没有;这就是
HttpMethod=“POST”
。尝试添加此项,并让我知道您的进展情况-不要将其与现有的
FormMethod.Post
混淆;你可以把它留在…不可能!容易犯错误。不管是谁,为了清楚起见,我在编辑我的答案时对我最后的评论进行了扩展。祝你好运!:)我解释了我的反对票。我认为我的回答似乎是虚伪的。我已经编辑了我的回答,包括逻辑可以在哪里——他已经提到,他已经把逻辑放在控制器中;所以我认为这就是他前进的方向,我需要知道如何将结果解析为页面上的div-如果你有点生气,请原谅
<div id="searchResults"></div>
new AjaxOptions {
            HttpMethod = "POST",
            UpdateTargetId = "searchResults",
            InsertionMode = InsertionMode.Replace
}
public class MyModel
{
  public string PageToRender { get; set; }
}
public ActionResult DoLogic()
{
  //var Results = ?? as The ENum

  switch(Results)
  {
    PrefixSearch.SearchResults.CustomerFound:
      model.PageToRender = "_CustomerPrefixInfo";
    // etc etc
  }    

  return View(model);
}
 @{if (!string.IsNullOrEmpty(model.PageToRender))
   Html.RenderPartial(model.PageToRender);}
public enum SearchResults
{
  [Display(Name="_CustomerPrefixInfo")]
  CustomerFound
}