【问题标题】:How can i pass ViewData to Action method from class?如何将 ViewData 从类传递给 Action 方法?
【发布时间】:2021-09-20 18:14:53
【问题描述】:

我要换

public IActionResult Index()
{
ViewData["SomeData"] = ...
return View();
}

public IActionResult Index()
{
 _someDataCretor.Create(...);
return View();
}

SomeDataCretor.Create() 中应该发生什么才能使其工作?让View获取ViewData。

谢谢。

【问题讨论】:

    标签: c# .net asp.net-core


    【解决方案1】:

    ViewData 定义为public ViewDataDictionary ViewData { get; set; }。因此,您可以将其作为参数传递给您的方法:

    public IActionResult Index()
    {
        _someDataCretor.Create(ViewData);
        return View();
    }
    

    Create(ViewDataDictionary viewdata) 方法中:

    viewdata["SomeData"] = ...;
    

    但我认为更合理的方法是从 Create() 方法返回一个对象,该对象将作为视图模型传递给 Index 视图。

    【讨论】:

      【解决方案2】:

      假设_someDataCreator 在视图中包含您想要的数据,您只需将其作为模型传递:

      return View(_someDataCreator);
      

      或者如果它返回一个对象,您可以返回该结果:

      var result = _someDateCreator.Create(...);
      return View(result);
      

      并在您看来引用该类型:

      @model My.Namespace.MyObject
      

      【讨论】:

        【解决方案3】:

        ViewData用于将数据从控制器传递到视图和视图内,包括部分视图和布局。您可以尝试使用TempData,这是一个演示:

        public class MyDepedency
            {
                private readonly IHttpContextAccessor _httpContextAccessor;
                private readonly ITempDataDictionaryFactory _tempDataDictionaryFactory;
        
                public MyDepedency(IHttpContextAccessor httpContextAccessor, ITempDataDictionaryFactory tempDataDictionaryFactory)
                {
                    _httpContextAccessor = httpContextAccessor;
                    _tempDataDictionaryFactory = tempDataDictionaryFactory;
                }
        
                public void Create()
                {
                    var httpContext = _httpContextAccessor.HttpContext;
                    var tempData = _tempDataDictionaryFactory.GetTempData(httpContext);
        
                    // use tempData as usual
                    tempData["SomeData"] = "Bar";
                }
             
            }
        

        启动:

        public void ConfigureServices(IServiceCollection services)
                {
                    ...
                    services.AddControllersWithViews();
                    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
                    services.AddSingleton<MyDepedency, MyDepedency>();
                }
        

        控制器:

        public class HomeController : Controller
            {
                public MyDepedency _myDepedency;
               
                public HomeController(MyDepedency myDepedency)
                {
                    _myDepedency = myDepedency;
                }
        
                public IActionResult Index()
                {
                    _myDepedency.Create();
                    return View();
                    
                }
        

        查看:

        <h1>@TempData.Peek("SomeData")</h1>
        

        结果:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多