【问题标题】:Why can't my controller find/return my partialview?为什么我的控制器找不到/返回我的局部视图?
【发布时间】:2015-07-24 21:25:09
【问题描述】:

我无法将部分视图返回到我的控制器。我已经能够成功地做到这一点,但似乎我在做两次时遇到了麻烦。错误在代码的末尾。这是我的工作流程:

控制器名称:

public class PatientMergeController : Controller

页面加载,返回视图:

public ActionResult Index()
{
    return View();
}

返回的视图是Index.cshtml:

@using ThisController = myNameSpace.Web.App.Controllers.PatientMerge.PatientMergeController
@model IEnumerable<myNameSpace.Repository.Model.PatientMerge>
@Scripts.Render(myNameSpace.Web.App.BundleConfig.GetVirtualPathForScript(myNameSpace.Web.App.BundleConfig.Scripts.PatientMerge))
@using System.Web.Helpers;
<div id="">
    <h2>
        Patient Merge
    </h2>
    <div class="container">
        <div class="searchOneWrp">
            <fieldset>
                <legend><strong>Patient One Search</strong></legend>
                First Name: <input type="text" id="fnamePone" />
                Last Name: <input type="text" id="lnamePone" />
                D.O.B.: <input type="text" id="dobPone" />
                <button class="patient_look_up_button" id="btnPOneSearch" name="btnPOneSearch" type="submit" onclick="SearchOne()"
                        title="Search">
                    Search
                </button>
            </fieldset>
            <div id="grdPatientOneSearch">
                @{Html.RenderPartial("PatientOneSearch", Model);}
            </div>
            <div id="grdPatientOneOrderWrp">
                @{Html.RenderPartial("PatientOneOrderDetails", Model);}
            </div>
            <div id="grdPatientOneRxWrp">

            </div>
            <div id="grdPatientOneNotesWrp">

            </div>
        </div>

        <div class="searchTwoWrp">
            <fieldset>
                <legend><strong>Patient Two Search</strong></legend>
                First Name: <input type="text" id="fnamePtwo" />
                Last Name: <input type="text" id="lnamePtwo" />
                D.O.B.: <input type="text" id="dobPtwo" />
                <button class="patient_look_up_button" id="btnPTwoSearch" name="btnPTwoSearch" type="submit" onclick="SearchTwo()"
                        title="Search">
                    Search
                </button>
            </fieldset>
            <div id="grdPatientTwoSearch">
                @{Html.RenderPartial("PatientTwoSearch", Model);}
            </div>
            <div id="grdPatientTwoOrderWrp">

            </div>
            <div id="grdPatientTwoRxWrp">

            </div>
            <div id="grdPatientTwoNotesWrp">

            </div>
        </div>
    </div>
</div>

这会加载一些搜索文本框。当用户执行搜索时,他们会单击搜索按钮。搜索按钮执行这个 JS:

function SearchOne() {
    var fname = $("#fnamePone").val();
    var lname = $("#lnamePone").val();
    var dob = $("#dobPone").val();
    var url = "/PatientMerge/PatientSearch";

    //post to server, expect partial view to be returned as html, update page
    $.post(url, { 'fname': fname, 'lname': lname, 'dob': dob, pat_number: 1 })
        .done(function (response) {
            $("#grdPatientOneSearch").html(response);
        });
}

控制器方法PatientSearch被调用:

public PartialViewResult PatientSearch(string fname, string lname, string dob, int pat_number)
{
    try
    {
        var target = new PatientRepository();
        var result = target.GetPatient(fname, lname, dob, "", "", "");
        List<myNameSpace.Repository.Model.PatientMerge> patientList = new List<myNameSpace.Repository.Model.PatientMerge>();

        for (int i = 0; i < result.Count; i++)
        {
            myNameSpace.Repository.Model.PatientMerge patient = new myNameSpace.Repository.Model.PatientMerge();
            patient.pat_id = result[i].PatientId;
            patient.fname = result[i].FirstName;
            patient.lname = result[i].LastName;
            patient.phone_no = result[i].Phone;
            patient.birth_date = result[i].DateOfBirth;
            patient.AgeYears = result[i].Age;
            patient.gender_cd = result[i].Gender;
            patient.addr1 = result[i].Address1;
            patient.addr2 = result[i].Address2;
            patient.city = result[i].City;
            patient.state_cd = result[i].State;
            patientList.Add(patient);
        }
        if (pat_number == 1)
        {
            //perform patient one search query and pone view return
            return PartialView("PatientOneSearch", patientList);
        }
        else
        {
            //perform patient two search query and pone view return
            return PartialView("PatientTwoSearch", patientList);
        }

    }
    catch (Exception ex)
    {
        myNameSpace.Repository.Model.PatientMerge patient = new myNameSpace.Repository.Model.PatientMerge();
        List<myNameSpace.Repository.Model.PatientMerge> patientList = new List<myNameSpace.Repository.Model.PatientMerge>();
        patient.fname = "Error";
        patientList.Add(patient);
        Logger.Log.Error(ex.Message + ex.StackTrace + ex.InnerException);
        //return Json(new { error = ex.Message }, JsonRequestBehavior.AllowGet);
        if (pat_number == 1)
        {
            //perform patient one search query and pone view return
            return PartialView("PatientOneSearch", null);
        }
        else
        {
            //perform patient two search query and pone view return
            return PartialView("PatientTwoSearch", null);
        }
    }
}

这个控制器返回局部视图 PatientOneSearch.cshtml

@using ThisController = myNameSpace.Web.App.Controllers.PatientMerge.PatientMergeController
@model IEnumerable<myNameSpace.Repository.Model.PatientMerge>

@{
    myNameSpace.Repository.Model.PatientMerge pat = new myNameSpace.Repository.Model.PatientMerge();
}
@if (Model != null)
{
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: 20, selectionFieldName: "selectedRow", ajaxUpdateContainerId: "grdContent");
    grid.Pager(WebGridPagerModes.NextPrevious);
    <div id="grdContent">
        @grid.GetHtml(tableStyle: "webgrid PatientOneGrid",
                        headerStyle: "table-header",
                        alternatingRowStyle: "alt POneSearch",
                        selectedRowStyle: "select POneSearch",
                        rowStyle: "POneSearch",
                        columns: grid.Columns(
                        grid.Column("pat_id", "Patient ID"),
                         grid.Column("pat_status_cn", "Status"),
                        grid.Column("fname", "First Name"),
                        grid.Column("lname", "Last Name"),
                        grid.Column("birth_date", "DOB"),
                         grid.Column("AgeYears", "Age"),
                          grid.Column("gender_cd", "Gender"),
                        grid.Column("phone_no", "Phone"),
                        grid.Column("addr1", "Address 1"),
                        grid.Column("addr2", "Address 2"),
                        grid.Column("city", "City"),
                        grid.Column("state_cd", "State")
                        )
                        )
    </div>
}
else
{
    <label>No records found.</label>
}

上面的视图填充了一个网络网格。下面的 JS 正在等待行点击。

<script>
    $('.POneSearch').on('click', function () {
        SearchOneGetDetails(this);
    });
</script>

点击的行,执行这个函数:

function SearchOneGetDetails(obj) {
    var url = '/PatientMerge/OrderSearch';
    var patid = $(obj).find('td:first').text();

    $.post(url, { 'pat_id': patid , 'pat_number': 1 })
        .done(function (response) {
            $("#grdPatientOneOrderWrp").html(response);
        });
}

控制器方法OrderSearch被调用:

public PartialViewResult OrderSearch(int pat_id, int pat_number)
{
    try
    {
        var target = new PatientRepository();
        var result = target.GetPatientOrders(pat_id, "36500");
        List<myNameSpace.Repository.Model.PatientMergeOrder> patientList = new List<myNameSpace.Repository.Model.PatientMergeOrder>();

        for (int i = 0; i < result.Count; i++)
        {
            myNameSpace.Repository.Model.PatientMergeOrder patient = new myNameSpace.Repository.Model.PatientMergeOrder();
            patient.DrugName = result[i].DrugName;
            patient.InvoiceNBR = result[i].InvoiceNumber;
            patient.LineStatus = result[i].LineStatusDescr;
            patient.OrderDate = result[i].OrderDate.ToString();
            patient.OrderNum = result[i].ParentOrderNo.ToString();
            patient.PrimInsur = result[i].PrimaryInsurerName;
            patient.SeconInsur = result[i].SecondaryInsurerName;
            patient.ShipDate = result[i].ShipDate.ToString();
            patient.StorePlusID = result[i].StoreId.ToString();
            patient.TrackCode = result[i].TrackingCode;
            patientList.Add(patient);
        }
        if (pat_number == 1)
        {
            //perform patient one search query and pone view return
            return PartialView("PatientOneOrderDetails", patientList);
        }
        else
        {
            //perform patient two search query and pone view return
            return PartialView("PatientTwoOrderDetails", patientList);
        }

    }
    catch (Exception ex)
    {
        Logger.Log.Error(ex.Message + ex.StackTrace + ex.InnerException);
        if (pat_number == 1)
        {
            //perform patient one search query and pone view return
            return PartialView("PatientOneOrderDetails", null);
        }
        else
        {
            //perform patient two search query and pone view return
            return PartialView("PatientTwoOrderDetails", null);
        }
    }
}

这里是问题发生的地方。我希望返回部分视图“PatientOneOrderDetails”。我的代码运行并进入 if 语句 if(pat_number == 1) 并到达执行部分返回的行,但从未进入该部分文件。我不认为 MVC 可以找到我的部分,但我不明白为什么。

我的视图结构是:

视图/PatientMerge/...

  • Index.cshtml
  • PatientOneSearch.cshtml
  • PatientOneOrderDetails.cshtml

这是预期视图返回的代码:

@using ThisController = myNameSpace.Web.App.Controllers.PatientMerge.PatientMergeController
@model IEnumerable<myNameSpace.Repository.Model.PatientMerge>

@{
    myNameSpace.Repository.Model.PatientMerge pat = new myNameSpace.Repository.Model.PatientMerge();
}
@if (Model != null)
{
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: 20, selectionFieldName: "selectedRow", ajaxUpdateContainerId: "grdOrderContentOne");
    grid.Pager(WebGridPagerModes.NextPrevious);
    <div id="grdOrderContentOne">
        @grid.GetHtml(tableStyle: "webgrid",
                        headerStyle: "table-header",
                        alternatingRowStyle: "alt",
                        selectedRowStyle: "select",
                        columns: grid.Columns(
                        grid.Column("add_date", "Order Date"),
                         grid.Column("order_id", "Order #"),
                        grid.Column("StorePlusID", "Order Store"),
                        grid.Column("LineStatus", "Line Status"),
                        grid.Column("invoice_nbr", "Script"),
                        grid.Column("drug_name", "Drug Name"),
                        grid.Column("PrimaryInsurance", "Primary Insurance"),
                        grid.Column("SecondaryInsurance", "Secondary Insurance"),
                        grid.Column("ship_date", "Ship Date"),
                        grid.Column("tracking_code", "UPS Tracking #")
                        )
                        )
    </div>
}
else
{
    <label>No records found.</label>
}

【问题讨论】:

  • 如果您在网络选项卡上使用浏览器开发工具并观察响应,返回的是什么?
  • @James Internal Server Error 500 at localhost:57787/PatientMerge/OrderSearch,方法:POST
  • 用return断行,然后f11进入视图。可能是模型或剃刀错误。单步执行会告诉你
  • 您的视图中可能存在问题,除非您指定这样做,否则不会导致编译时间。不确定启用它的正确方法,但如果您右键单击您的项目 -> 发布 -> 设置 -> 文件发布选项 -> 在发布期间检查预编译。现在,当您将构建设置为“发布”并编译它时,如果有任何 Razor 异常,它将失败。
  • 模型定义错误,您希望在部分中使用 myNameSpace.Repository.Model.PatientMerge 并且您正在发送 myNameSpace.Repository.Model.PatientMergeOrder

标签: c# asp.net-mvc asp.net-mvc-4 razor partial-views


【解决方案1】:

模型定义错误,您希望在部分中使用 myNameSpace.Repository.Model.PatientMerge 并且您正在发送 myNameSpace.Repository.Model.PatientMergeOrder

【讨论】:

    猜你喜欢
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多