我在名为AspNetAssessment_QuestionController的控制器中有一个方法
public ActionResult Excel_Data(HttpPostedFileBase excelfile)
{
if ( excelfile == null )
{
ViewBag.Error = "Please select an excel file";
return View("Create");
}
else if (excelfile.FileName.EndsWith("xls") || excelfile.FileName.EndsWith("xlsx"))
{
return View("Index");
}
else
{
ViewBag.Error = "File type is incorrect";
return View("Create");
}
}
现在,当此方法返回视图时,请求的视图需要一些viewbag数据来运行其剃刀语法,如“Create”和“Index”都有:
@Html.DropDownList("ClassID", null, htmlAttributes: new { @class = "form-control" })
由于系统只是在没有按下方法的情况下返回我的视图,因此无法从Create和Index的方法中获取viewbag的值。
我还添加了路由,因此他们将routes.config文件中的方法命中为
routes.MapRoute(
name: "AspNetAssessment_Question/Create",
url: "{controller}/{action}/{id}",
defaults: new { controller = "AspNetAssessment_Question", action = "Create", id = UrlParameter.Optional }
);
同样适用于索引但是当excel_data方法返回视图时,我收到一条错误,即后续网址上缺少Viewbag.propertyname数据
http://localhost:1331/AspNetAssessment_Question/Excel_Data
我甚至试图调用他们的方法,比如Create()而不是返回视图(“Create”)但是它失败了并且没有呈现视图。
create方法有两种形式。一个点击Excel_data的方法,另一个点击Create方法
如何点击他们的方法并从Excel_Data返回视图,以便他们从他们的方法和Excel_Data中获取视图数据。
excel_data方法指定viewbag.Error并且在create方法中我有viewbag.ClassID等等。
答案 0 :(得分:1)
解决您的问题很简单
在提供解决方案之前,我们需要了解两个视图和重定向行为及其差异:
简而言之,return view()就像asp.net中的server.Transfer(),而redirecttoaction会向浏览器发出302请求。
详细信息可以在这篇非常好的文章中找到: http://www.dotnettricks.com/learn/mvc/return-view-vs-return-redirecttoaction-vs-return-redirect-vs-return-redirecttoroute
所以现在你的问题的解决方案是:
用于返回redirectoaction()而不是return view()
您的示例略有修改:
public ActionResult Excel_Data(HttpPostedFileBase excelfile)
{
if ( excelfile == null )
{
ViewBag.Error = "Please select an excel file";
return View("Create");
}else if (excelfile.FileName.EndsWith("xls") || excelfile.FileName.EndsWith("xlsx"))
{
return View("Index");
}
else
{
TempData["Error"] = "File type is incorrect"; //replaced tempdata with viewbag
return RedirectToAction("Create","AspNetAssessment_QuestionController")
}
}
注意:要保留错误消息使用tempdata [“error”]而不是上面代码中提到的viewbag.error 。
您可以直接在创建视图中访问tempdata的数据,而无需执行任何创建操作方法。
创建视图代码ex:
@if(tempdata["error"]!= null)
{
var result = tempdata["error"];
}
多数民众赞成
<强>供参考:强>
如果你想要一个额外的信息,比如如何投射不同的tempdata对象以及viewbag,viewdata,tempdata之间的区别,请参考以下链接:http://www.binaryintellect.net/articles/36941654-8bd4-4535-9226-ddf47841892f.aspx
那篇文章有一个非常好的解释
希望它会有所帮助
由于 KARTHIK
答案 1 :(得分:0)
如果只是您要显示的错误消息,您可以将它们保存到会话/ cookie并使用RedirectToAction namespace Ploeh.Samples
open System
module Messaging =
type Envelope<'a> = {
Id : Guid
Created : DateTimeOffset
Item : 'a }
let envelop getId getTime item = {
Id = Guid "1CF889F8-201F-44DF-BC86-77227651D3EE"
Created = DateTimeOffset.MinValue
Item = item }
module MessagingTests =
open Xunit
type Foo = { Text : string; Number : int }
[<Fact>]
let ``enevelope returns correct results`` () =
let getId _ = Guid "1CF889F8-201F-44DF-BC86-77227651D3EE"
let getTime _ = DateTimeOffset( 636322011751405346L,
TimeSpan.FromHours(-4.0) )
let item = { Text = "Bar"; Number = 42 }
let actual = Messaging.envelop getId getTime item
Assert.Equal ( Guid "1CF889F8-201F-44DF-BC86-77227651D3EE",
actual.Id )
Assert.Equal ( DateTimeOffset( 636322011751405346L,
TimeSpan.FromHours(-4.0) ),
actual.Created )
Assert.Equal ( item, actual.Item )
而不是return RedirectToAction("Create", "AspNetAssessment_QuestionController");
。
然后在Create / Index ActionResults中,你可以添加如下内容:
return View("Create");