在c# MVC中不能返回带有不同参数的View() - Ajax更新页面内容的问题
本文关键字:Ajax 更新 问题 View 返回 不能 MVC 参数 | 更新日期: 2023-09-27 18:16:15
所以基本上,我正在构建一个日历,人们可以通过点击单元格和通过Ajax请求发送数据来添加他们的会议。这部分已经很好地工作了,但是我不知道如何将正确的参数传递给Index()视图。
编辑:我现在的问题在于将结果返回给页面的Ajax函数。我试图在jQuery Ajax做MVC Ajax选项的等效UpdateTargetId,但我不能找到一个足够的方式这样做。
当前Ajax函数:
function AjaxAddRDV() {
$.ajax({
url: "/Agenda/AddRDV",
async: "true",
type: "GET",
data: { "jour": rdvjour.val(), "mois": rdvmois.val(), "annee": rdvannee.val(), "text": rdvtext.val() },
success: function (result) {
$(".cal-container").html(result); // This gives me the right result but my click events do not work anymore
/*if (data && data.successUrl) {
window.location.href = data.successUrl;
}*/ this reloads the page, which I am trying to avoid
}
});
}
注意:我的HTML从ViewModel获取数据,并使用传递给模型的月份和年份创建一个表,给定正确的参数,它永远不会失败。
public ActionResult Index(int annee = 0, int mois = 0)
{
DateTime date = DateTime.Now;
if (annee == 0) annee = date.Year;
if (mois == 0) mois = date.Month;
AgendaViewModel Agendata = CreateAgendaViewModel(annee, mois);
if (dal.GetFirstDay(annee, mois) == 0)
{
return View("Error");
}
return View(Agendata);
}
这个方法在Ajax添加一个新的约会时被触发://我从原来的问题编辑
public ActionResult AddRDV(int jour, int mois, int annee, string text) { AgendaViewModel Agendata = new AgendaViewModel(); if (!string.IsNullOrWhiteSpace(text)) { dal.SetRdv(jour, mois, annee, text); Agendata = CreateAgendaViewModel(annee, mois); } return PartialView("Calendrier", Agendata); }
我尝试更新的HTML如下:
@model DASIWelcome.ViewModels.AgendaViewModel
(...)
<body>
<div id="wrapper">
<div id="prevmonth" class="switchmonth">←</div>
<div class="cal-container">
@Html.Partial("Calendrier",Model)
</div>
<div id="nextmonth" class="switchmonth">→</div>
</div>
</body>
我试图得到@Html。每次发送Ajax请求时都会更新部分内容。
最终目标是要有一个Ajax函数,在默认情况下刷新当前月份的日历,如果更改了月份、添加了新的约会等,该函数将返回带有自定义参数的相同日历。
我最近才开始c# MVC,但是我花了一整天的时间试图解决这个问题,我找不到一个不是很丑和不推荐的解决方案…
任何帮助将非常感激!
我尝试过的事情:
- 构建第二个带有参数的索引方法-加载失败,是否有歧义
- 找出哪个方法调用index首先在动作之间分叉-没有工作+被认为是一个丑陋的解决方案无处不在我看
之前的问题已经解决了,这里是我挣扎的地方,这让我无法继续前进:
- 点击功能不能在动态创建的元素上工作,因此每次页面加载只工作一次。
- 首先,我不能得到jQuery Ajax函数刷新我的表相同的方式,MVC Ajax UpdateTargetId函数将。
$("#wrapper").on("click", ".week td", function(){
我对on()函数难以理解的是第一个选择器 $("#wrapper")必须是static,而第二个选择器 "。是动态创建的元素的选择器。
因为我试图修复错误的事情,我确实设法找到MVC Ajax UpdateTargetId和jQuery Ajax之间的等效:jQuery:
$.ajax({
url: "/Agenda/AddRDV",
async: "true",
type: "GET",
data: { "jour": rdvjour.val(), "mois": rdvmois.val(), "annee": rdvannee.val(), "text": rdvtext.val() },
success: function (result) {
$("#cal-container").html(result);
}
});
MVC Ajax: @using (Ajax.BeginForm("AddRDV", new AjaxOptions {
HttpMethod = "GET",
//InsertionMode = InsertionMode.Replace,
UpdateTargetId = "cal-container",
OnComplete = "rdvdialog.dialog('close')"
}))
{
<label for="rdvannee">Année</label>
<label for="rdvmois">Mois</label>
<label for="rdvjour">Jour</label>
<br />
<input type="text" name="annee" id="rdvannee" maxlength="4" size="4" />
<input type="text" name="mois" id="rdvmois" maxlength="2" size="2" />
<input type="text" name="jour" id="rdvjour" maxlength="2" size="2" />
<br />
<br />
<label for="rdvtext">Titre</label><br />
<input type="text" name="text" id="text" maxlength="250" />
<input type="submit" name="Envoyer" value="Envoyer" />
}
特别感谢 light ,他为我指出了正确的方向,并提供了一些有用的替代方案!
您的"ChangeMonth"方法与Index方法相同,但增加了参数。当用户更改日历时,只需重新加载Index。我甚至建议你做一个函数来照顾你的ViewModel创建,这样你就可以在其他ActionMethods中重用模型,如果你需要它:
public AgendaViewModel CreateAgendaViewModel(int annee, int mois)
{
AgendaViewModel agendata = new AgendaViewModel();
agendata.ListRDV = dal.GetListRDV(mois, annee); //Loads the list of appointments for the chosen month
agendata.FirstDay = dal.GetFirstDay(annee, mois);
agendata.MonthLength = dal.GetMonthLength(annee, mois);
agendata.MonthName = dal.GetMonthName(mois) + " " + annee.ToString();
agendata.Mois = mois;
agendata.Annee = annee;
return agendata;
}
public ActionResult Index(int annee = 0, int mois = 0)
{
DateTime date = DateTime.Now;
if(annee == 0) annee = date.Year; // if not set initialize with default year
if(mois == 0) mois = date.Month; // if not set initialize with default month
AgendaViewModel Agendata = CreateAgendaViewModel(annee, mois);
if (dal.GetFirstDay(annee, mois) == 0)
{
return View("Error");
}
return View(Agendata);
}
在add方法中,现在您可以使用所选的月份和年份重定向到索引:
public ActionResult AddRDV(int jour, int mois, int annee, string text)
{
if (!string.IsNullOrWhiteSpace(text))
{
dal.SetRdv(jour, mois, annee, text);
}
return RedirectToAction("Index", new { annee = annee, mois = mois });
}
另一个注意事项-请用英语编写代码。如果你用英语命名参数和变量,不仅对你自己,而且对其他可能看你代码的人来说,你的代码会更容易读。
希望这对你有帮助;编辑:
有两种方法可以从ajax函数中重定向:1)如果页面上没有其他功能,你可以通过传递Json结果和URL路由来重载整个页面:public JsonResult AddRDV(int jour, int mois, int annee, string text)
{
if (!string.IsNullOrWhiteSpace(text))
{
dal.SetRdv(jour, mois, annee, text);
}
var successUrl = Url.Action("Index", new { annee = annee, mois = mois });
return Json(new {successUrl = successUrl});
}
Then in your ajax you do redirect to the index page:
$.ajax({ ...,
success: function(data) {
if(data && data.successUrl){
window.location.href = data.successUrl;
}
}
});
2)您可以更改您的逻辑,以便在页面内加载的部分视图中创建日历。然后,您可以通过调用ajax重新加载日历的包装器来重新加载部分视图—您可以在这里查看一个示例
看起来您试图从同一个方法(Index)完成几件事。
选项1
当数据发布时,您在Index
中收到FormCollection
对象。因此,张贴的任何内容都可以在表单集合中检索。然后,您的代码可以理解接收到什么数据并将其正确地分派给正确的方法。
代码应该是这样的:
[HttpPost]
public ActionResult Index(FormCollection formCollection)
{
var myValue = formCollection["myvalue"];
}
选项2
第二个选项是使用和调用不同的方法,但使用相同的View()
。视图的输出如下所示:
public ActionResult OtherAction(string param1)
{
var model = this.GenerateModel(param1);
// Use the index View (assuming the controller is called Calendar
return View("Calendar/Index", model );
}
第二个选项(你在问题中尝试过的)的问题是它做的事情太多了。我认为日期应该是一个参数。您还应该在一个单独的函数中构建模型。这样,将正确的参数发送到"模型生成器"并获得预期的输出将更容易。
哭不会帮助修复你的代码…但它可能会减轻你的痛苦。: -)