通过调用方法从方法返回视图

时间:2017-06-04 20:37:09

标签: c# asp.net asp.net-mvc razor

我在名为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等等。

2 个答案:

答案 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");