Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC 3如何在维护视图的同时使用Post Redirect Get方法生成表单_C#_Asp.net Mvc 3_Post Redirect Get - Fatal编程技术网

C# MVC 3如何在维护视图的同时使用Post Redirect Get方法生成表单

C# MVC 3如何在维护视图的同时使用Post Redirect Get方法生成表单,c#,asp.net-mvc-3,post-redirect-get,C#,Asp.net Mvc 3,Post Redirect Get,我读了很多关于Stack的文章,也读了一些关于如何设计适当表单的文章。我最终采用了PRG方法 我遇到的问题实际上是让它在IE8中工作。它在Firefox中可以正常工作。我只是想知道我做错了什么 更新 由于反复试验,表单验证现已修复。IE验证脚本不适用于Jquery 1.7。它们确实按照预期使用jQuery1.5 编辑 表单验证也不能在IE中使用此当前设置。如能对此有所了解,将不胜感激 问题 1.创建视图实际上是作为索引视图内部的局部视图加载的。图片弹出窗口以添加新订户 因此,当表单提交并且无效时

我读了很多关于Stack的文章,也读了一些关于如何设计适当表单的文章。我最终采用了PRG方法

我遇到的问题实际上是让它在IE8中工作。它在Firefox中可以正常工作。我只是想知道我做错了什么

更新

由于反复试验,表单验证现已修复。IE验证脚本不适用于Jquery 1.7。它们确实按照预期使用jQuery1.5

编辑
表单验证也不能在IE中使用此当前设置。如能对此有所了解,将不胜感激

问题

1.创建视图实际上是作为索引视图内部的局部视图加载的。图片弹出窗口以添加新订户

因此,当表单提交并且无效时,它会转到部分视图创建,这看起来很可笑,因为部分视图是一个弹出窗口,而不是一个页面

我如何修复此问题,使弹出窗口在无效时保持打开状态,而不是发回创建视图

我是否应该忘记弹出窗口,为表单创建一个新页面?PRG和表单的最佳实践和最实用的解决方案是什么

我设置的结构如下所示:

型号

 public class Subscribers
    {
        [Required(ErrorMessage="Name is required")]
        [Display(Name = "Subscriber Name: ")]
        public string Name { get; set; }

        [Required(ErrorMessage = " URI is required")]
        [Display(Name = "URI (email or url): ")]
        public string URI { get; set; }

        [Display(Name = "Channel: ")]
        [Required(ErrorMessage = " Channel is required")]
        public int SelectedChannelID { get; set; }

        [Display(Name = "Subscriber Type: ")]
        [Required(ErrorMessage = " Type is required")]
        public int? SelectedSubscriberTypeID { get; set; }

        public List<Models.Subscriber> getSubscribers()
        {

            Models.SwitchboardEntities db = new Models.SwitchboardEntities();
            List<Models.Subscriber> subscriberList = db.Subscribers.ToList();

            return subscriberList;
        }

您需要将数据存储在控制器和视图(如果需要)都可用的
TempData
对象中,然后提取数据并在下次请求时使用它

控制器 这会将模型存储在下一个请求的
TempData
对象中,并将用户发送回索引操作。此操作可以执行其正常例程,一旦它点击
@Html.RenderAction(“RenderCreate”)
行,新逻辑将获取临时数据并将其发送到视图

public PartialViewResult RenderCreate() { // use name of partial view here
  // The next line will use the model from the TempData if it exists or
  // create a new, empty model if it does not.

  // Using the create method above as an example, if the model is valid,
  // the next line will create a new subscribers object to pass to the partial
  // view. If it was invalid, it'll use the object stored in TempData instead.
  Models.Subscribers model = 
      this.TempData["SubscribersTemp"] as Model.Subscribers ??
      new Model.Subscribers();

  return this.View(model);
}

TempData
对象将仅为下一个请求保存数据。一旦该请求完成,就会清理
TempData
对象。

有许多事情您做得不太正确。首先,jQuery应该加载到布局文件中(在head部分),而不是局部视图中(我假设Create.cshtml是局部视图)。jQuery需要尽早加载(并且应该是加载的第一个脚本),并且应该在呈现页面之前加载。把它放在这么远的地方,你只是在自找麻烦

我还将在布局中加载jquery.validation和jquery.validation.unobtrusive

如果可以,我会下载MVC4测试版,并生成一个默认的互联网应用程序。MVC4默认应用程序使用弹出式登录对话框,其中包括验证,如果验证失败,该对话框不会消失。。正是你要找的。您应该能够根据自己的需要调整他们的代码


另外,请确保您拥有jQuery.validation和jQuery.validation.unobtrusive的最新版本。使用NuGet检索所有内容的最新版本。

如果我的模型状态无效,Create方法会返回什么?哦,nvm,我想你是想写
返回这个。重定向操作…
当模型无效时,我真的想停留在弹出窗口上。如果弹出窗口关闭并返回索引,则必须重新加载RenderCreate表单。我是否误解了您的解决方案?根据弹出窗口的工作方式,您可以使其与信息一起弹出。如果是javascript,只需在document ready事件上添加一些逻辑(假设jQuery),并添加类似
@If(Model!=null){$(“#popup”).dialog(“show”)}
的内容。(这些标记是为了告诉razor,if语句中的文本不是附加的razor代码,而是要呈现到页面的实际文本(在本例中是javascript。)弹出窗口的好解决方案:)。但我仍然无法使用IE8实现这一点。我的表单验证不再工作了。我可以向您保证,jquery验证在IE8和jQuery1.7中工作得很好。很明显,你正在做的事情让IE感到困惑。@Mystere Man好吧,请告诉我,因为“显然我正在做的事情”并不那么清楚……因为它适用于1.5而不是1.7,而且我在代码中没有更改任何其他内容,所以我只是进行逻辑推断。我非常乐意接受你给我的任何建议:)人们总是说“当我做这件事的时候,它会起作用,但当我做那件事的时候,它不会起作用,所以它肯定有问题。”而事实上,问题出在其他地方,当你做那件事的时候,它就出现了。很多时候,代码在第一种情况下不应该工作,但出于某种幸运的原因,它工作了,尽管它是错误的。当新版本的操作系统问世时,你会经常看到这一点。有些人的代码被破坏了,他们责怪新的操作系统,而实际上他们的代码被破坏了,只是碰巧在旧版本中工作。我的观点是你在做假设,而不是推断。我同意你的观点。但我的观点是,我没有得到建议或建设性的反馈。仅仅指出我的假设是错误的并不能为我指明正确的方向。很明显,我来这里是想问一个专家群体,他们“看到”了我没有看到的东西。所以我做了一个假设,你指出了,现在呢?很酷的故事。我在下面的答案中给了你建议。
[HttpPost]
        public ActionResult Create(Models.Subscribers model)
        {
            try
            {
                // TODO: Add insert logic here
                if (ModelState.IsValid)
                {
                    return RedirectToAction("Index");
                }
                else
                {
                    return View(model);
                }
            }
            catch
            {
                return View(model);
            }
        }
public ActionResult Create(Models.Subscribers model) {
  // .. snip ..
  if (ModelState.IsValid) {
    return RedirectToAction("Index");
  }
  // .. snip ..
  this.TempData["SubscribersTemp"] = model;
  this.RedirectToAction("Index");
}
public PartialViewResult RenderCreate() { // use name of partial view here
  // The next line will use the model from the TempData if it exists or
  // create a new, empty model if it does not.

  // Using the create method above as an example, if the model is valid,
  // the next line will create a new subscribers object to pass to the partial
  // view. If it was invalid, it'll use the object stored in TempData instead.
  Models.Subscribers model = 
      this.TempData["SubscribersTemp"] as Model.Subscribers ??
      new Model.Subscribers();

  return this.View(model);
}