我是ASP.net和Razor Pages的新手。在下面的代码中,我试图用基于State下拉列表的值填充District下拉列表。这是到目前为止我得到的:
查看:
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
<script language="javascirpt" type="text/javascript">
function GetDist(_stateId) {
var procemessage = "<option value='0'> Please wait...</option>";
$("#select-state").html(procemessage).show();
var url = "/Info/GetDistById/";
$.ajax({
url: url,
data: { stateid: _stateId },
cache: false,
type: "POST",
success: function (data) {
var markup = "<option value='0'>Quận/Huyện</option>";
for (var x = 0; x < data.length; x++) {
markup += "<option value=" + data[x].Value + ">" + data[x].Text + "</option>";
}
$("#select-state").html(markup).show();
},
error: function (reponse) {
alert("error : " + reponse);
}
});
}
</script>
<div class="col-md-offset-0 col-md-2">
<select class="form-control" id="select-state" onchange = "javascript:GetDist(this.value);">
@foreach (var state in Model.tbState)
{
<option value=@state.StateId>@state.Statename</option>
}
</select>
</div>
<div class="col-md-1 ">Quận/Huyện: </div>
<div class="col-md-offset-0 col-md-2">
<select class="form-control" id="select-dist">
@foreach (var dist in Model.tbDistrict)
{
<option value=@dist.DistrictId>@dist.Districtname</option>
}
</select>
</div>
在我的cshtml.cs文件中,我有此代码。我在代码开头确实使用了System.Web.Helpers
:
public IActionResult GetDistById(int stateid)
{
List<TbDistrict> list = new List<TbDistrict>();
foreach (var q in tbDistrict)
{
if (q.StateId == stateid)
list.Add(q);
}
SelectList selectlist = new SelectList(list, "", "", 0);
JsonResult result = Json(selectlist);
return result;
}
我发现Json()方法仅适用于MVC中的Controller
类,而不适用于Razor PageModel
类,因此它给出错误CS0103“名称'Json'在当前上下文”。有办法使它起作用吗?
答案 0 :(得分:0)
ASP Pages具有常用的OnGet
和OnPost
方法。如果需要通过Ajax到同一页面的任何其他调用,则必须遵循OnGet*
和OnPost*
约定。
在给出的示例中,您需要将方法命名为OnPostDistById
,在Javascript中,您需要将URL命名为"/Info/DistById"
。如果是HTTP Get调用,则方法名称应为OnGetDistById
,而URL将保持不变。
有关更多信息,请参见here。
答案 1 :(得分:0)
有多个问题。
对于返回json,您需要使用
之类的return new JsonResult
来尝试@poke的建议
public IActionResult OnGetDistById(int stateid)
{
return new JsonResult(new Product { Id = stateid, Name = "Tom" });
}
对于PageModel
中的操作方法,其名称应使用OnGetDistById
对于客户端,其请求网址应为https://localhost:44358/index?handler=distbyid&stateid=2
,并指定handler
和查询字符串stateid
无论如何,如果您喜欢像/Info/GetDistById/
这样的请求url,则需要在您的razor项目中实现Web api,而不是PageModel
。
您可以关注:
在项目中添加ValuesController
,例如
[Route("api/[controller]")]
public class ValuesController : Controller
{
// GET: api/<controller>
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
}
在Startup.cs
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});