我是Razor和Partial的新手。基本上,我的总体需求是能够在用户单击按钮时更新表。
我现在要做的是单击按钮,一个ajax函数首先调用一个方法以用更新的信息填充字典,然后调用一个函数以返回应该显示此更新信息的局部视图。而不会刷新整个页面。
Ajax代码
<script>
$(document).ready(function(){
$("#AddContactQue").click(function(e)
{
e.preventDefault();
var name = $('#contactName').val();
var role = $('#contactRole').val();
console.log(name+','+role);
$.ajax({
url: "AddApplication?handler=AddContactToQue",
type: "POST",
dataType: "json",
data: { name,role },
beforeSend: function (xhr) {
xhr.setRequestHeader("XSRF-TOKEN",
$('input:hidden[name="__RequestVerificationToken"]').val());
},
success: function () {
alert("success");
},
complete: function () {
$('#contactsTB').load('/AddApplication?handler=AppPartial');
},
failure: function () {
alert("failure");
}
})
});
});
</script>
完成后,我会进行ajax调用以更新我的部分。
从我在网上阅读的内容来看,ajax preventDefault
应该阻止任何“回发”的发生,因此我后面代码中的数据不会丢失。
现在的问题是我填满了字典,然后在更新部分字典时,字典为空。因此,partial返回一个空表,里面没有任何内容。
更新信息方法
public void OnPostAddContactToQue(string name, string role)
{
Console.WriteLine("----------urlcount=-----"+appURLS.Count);
if(HttpContext.Session.GetString("selectedContact") == null)
{
string s = name + ",";
HttpContext.Session.SetString("selectedContact", s);
}
else
{
string l = HttpContext.Session.GetString("selectedContact");
l += name + ",";
HttpContext.Session.SetString("selectedContact",l);
}
if(HttpContext.Session.GetString("selectedContactRole") == null)
{
string s = role + ",";
HttpContext.Session.SetString("selectedContactRole", s);
}
else
{
string l = HttpContext.Session.GetString("selectedContactRole");
l += role + ",";
HttpContext.Session.SetString("selectedContactRole",l);
}
contactQue = HttpContext.Session.GetString("selectedContact");
contactRoleQue = HttpContext.Session.GetString("selectedContactRole");
List<string> cList = contactQue.Split(',').ToList<string>();
List<string> crList = contactRoleQue.Split(',').ToList<string>();
for(int i = 0; i < cList.Count; i ++)
{
appContacts.Add(cList[i],crList[i]);
}
PopulateTools();
Console.WriteLine(HttpContext.Session.GetString("selectedURLS"));
}
GetPartial方法
public Microsoft.AspNetCore.Mvc.PartialViewResult OnGetAppPartial()
{
return new Microsoft.AspNetCore.Mvc.PartialViewResult{ViewName = "_AppPartial",ViewData = new Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<Dictionary<string,string>>(ViewData,appContacts)};
}
在击中OnGetAppPartial
字典时,appContacts
为空。我不明白为什么将其设置为null,因为preventDefault
应该停止页面重新加载。
_AppPartial.cshtml
@model Dictionary<string,string>
<table class="table table-striped">
<tbody>
@foreach(var s in Model)
{
<tr>
<td>
@Html.Raw(s.Key + " - " + s.Value)
</td>
</tr>
}
</tbody>
</table>
我遵循https://www.mikesdotnetting.com/article/325/partials-and-ajax-in-razor-pages作为参考。