【发布时间】:2017-04-19 00:14:22
【问题描述】:
我有一个包含 if 语句的控制器,但它是否命中第一个或第二个块并不重要,因为它们都返回相同的类型。
[HttpPost]
public ActionResult Descriptions(string partsNo, Details searchValue)
{
var response = partsNo != null ? _referenceRepository.GetParts(partsNo) : _referenceRepository.SearchValue(searchValue);
return PartialView(response);
}
查看
@model ArrowEngineeringMVC.Models.Details
<script>
$(document)
.on("click",
".getPartNo",
function (e) {
var val = $(this).val();
$.ajax({
url: '/Home/Descriptions',
contentType: 'application/json',
type: 'POST',
data: JSON.stringify({ "partsNo": val }),
dataType: 'html'
})
.success(function (result) {
$('#descriptionPlace').html(result);
})
.error(function (xhr, status) {
alert(status);
});
})
</script>
@using (Html.BeginForm("Descriptions", "Home", FormMethod.Post))
{
<div class="topBar">
@Html.TextBoxFor(m => m.Type)
<input type="submit" id="submitId" value="submit"/>
</div>
}
<div class="leftPanel">
<button href="javascript:void(0)" id="NumbersButton" value="Number" class="getPartNo">#</button>
<button href="javascript:void(0)" value="A" class="getPartNo">A</button>
<button href="javascript:void(0)" value="B" class="getPartNo">B</button>
<button href="javascript:void(0)" value="C" class="getPartNo">C</button>
</div>
<div id="descriptionPlace"></div>
如果您单击其中一个按钮,它将点击 if 语句的第一部分。如果您这样做,则返回一个 PartialView 并且一切正常,按钮的值正在使用 AJAX 传递给控制器,而如果您进行搜索,它是通过模型传递的,这是唯一的区别。
如果您进行搜索,它会遇到不返回部分视图的 if 语句的第二部分,它只是出于某种原因返回一个新视图。
我只是感到困惑,因为变量 response 返回一个列表,但根据您点击的 if 语句的哪个部分包含不同的值。
这里有一点 referenceRepository 只是为了更容易理解:
public List<Parts> SearchValue(Details searchValue)
{
const string detailsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Type] = {0}";
string queryDetails = string.Format(detailsSql, searchValue.Type);
var dbDetails = getConnection().Query<Parts>(queryDetails).ToList();
return dbDetails;
}
public List<Parts> GetParts(string partNumber)
{
string partsSql;
if (partNumber == "Number")
{
partsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Part Number] not like '%[^0-9]%'";
}
else
{
partsSql = "SELECT [ID], [Description] FROM Table1 WHERE [Part Number] like '{0}%'";
}
string queryParts = string.Format(partsSql, partNumber);
var dbParts = getConnection().Query<Parts>(queryParts).ToList();
return dbParts;
}
【问题讨论】:
-
@GSerg Details 是我创建的一个对象,其中包含一个名为 Type 的属性,我将整个模型发布回控制器,并且 Type 属性将被填充
-
我想我误解了你的问题描述。显然你是说表单返回的部分视图替换了整个页面,而不是进入
#descriptionPlace。没错,当您提交表单时,浏览器会将它返回的任何内容显示为新页面。它不知道这不是一个“完整的”视图。如果您希望表单发布的结果进入#descriptionPlace,您需要像拦截clicks 一样拦截表单的submit,或者使用带有适当参数的Ajax.BeginForm。 -
@GSerg 哦,是的,谢谢你,你知道我将如何使用@Html.BeginForm 将它渲染到#descriptionPace 中吗?
-
您将为表单的
submit事件创建另一个事件处理程序,就像您为按钮的click事件创建的事件处理程序一样。或者你会使用@Ajax.*methods。
标签: c# model-view-controller partial-views