【发布时间】:2021-03-04 07:30:36
【问题描述】:
我希望能够完成的是:
让用户首先选择一个模型,然后显示与该模型相关的所有引擎。我一直在尝试从相关问题中调整代码,但没有成功。
这是我的一次尝试中的代码。
任何帮助将不胜感激。
CarsController.cs
public ActionResult GetEnginesByModelId(int ModelId)
{
EnginesRepository enginesRepository = new EnginesRepository();
List<Engine> engines = enginesRepository.GetAll(cascadeInclude: true).SelectMany(e => e.EngineModels).Where(em => em.ModelId == ModelId).Select(em => em.ParentEngine).ToList();
return Json(engines);
}
创建.cshtml
<div class="row">
<div class="col-md-2 ">
Model:
<select asp-items="@Model.Models" id="models">
</select>
</div>
</div>
<div class="row">
<div class="col-md-2 ">
Engines:
<select id="engines"></select>
</div>
</div>
jquery
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
var items = "<option value='0'>Select</option>";
$("#models").html(items);
});
$("#models").change(function () {
var modelId = $("#models").val();
var url = "/Cars/GetEnginesByModelId";
$.getJSON(url, { ModelId: modelId }, function (data) {
var item = "";
$("#engines").empty();
$.each(data, function (i, engine) {
item += '<option value="' + engine.value + '">' + engine.text + '</option>'
});
$("#engines").html(item);
});
});
</script>
更新:我设法点击控制器并获取项目列表,但它显示“未定义”。为了显示我使用 item.ToString() 方法的项目。这是我使用的js和c#。 JS
<script type="text/javascript">
$(document).ready(function () {
$("#models").on("change", function () {
$list = $("#engines");
$.ajax({
url: "/Cars/GetEnginesByModelId",
type: "GET",
data: { id: $("#models").val() }, //id of the state which is used to extract cities
traditional: true,
success: function (result) {
$list.empty();
$.each(result, function (i, item) {
$list.append('<option value="' + item["EngineId"] + '"> ' + item["ToString()"] + ' </option>');
});
},
error: function () {
alert("Something went wrong call the police");
}
});
});
});
</script>
创建.cshtml
<div class="row">
<div class="col-md-2 ">
<div class="customDiv">
Model:
<select id="models" name="ModelId">
@foreach (var carModel in Model.Models)
{
<option value="@carModel.Id">@carModel.Name @carModel.Price$</option>
}
</select>
</div>
</div>
</div>
<div class="row">
<div class="col-md-2 ">
<div class="customDiv">
Engines:
<select id="engines" name="EngineId">
@foreach (var engine in Model.Engines)
{
<option value="@engine.Id">@engine.ToString()</option>
}
</select>
</div>
</div>
</div>
【问题讨论】:
-
您的控制器是否在调试模式下被击中?你能把javascript中的Url改成
var url = "/Cars/GetEnginesByModelId" + "/" + modelId;并去掉{ ModelId: modelId }吗? -
不,控制器没有被击中。更改了网址,但仍然没有点击控制器。通常当我在 URL 中传递参数时,我会这样做:
/Cars/GetEnginesByModelId?ModelId=所以我尝试使用"?ModelId="而不是"/",但它仍然不起作用。 -
我在“wwwroot”中添加了本地 jquery,只是为了确保不是导致问题的 Google CDN。但仍然没有结果。这里是项目的 git:github.com/Angel239200/AudiCarCustomization.git
标签: c# asp.net-mvc asp.net-core cascadingdropdown