quiero reemplazar
public IActionResult Index() { ViewData["SomeData"] = ... return View(); }
con
public IActionResult Index() { _someDataCretor.Create(...); return View(); }
¿Qué debería suceder en SomeDataCreator.Create() para que esto funcione? Para que View obtenga ViewData.
Gracias.
ViewData
se define como public ViewDataDictionary ViewData { get; set; }
. Por lo tanto, puede pasarlo como un parámetro a su método:
public IActionResult Index() { _someDataCretor.Create(ViewData); return View(); }
Y en el método Create(ViewDataDictionary viewdata)
:
viewdata["SomeData"] = ...;
Pero supongo que un enfoque más razonable es devolver un objeto del método Create()
que se pasará a la vista Index
como modelo de vista.
Suponiendo _someDataCreator
contiene los datos que desea en la vista, simplemente los pasaría como modelo:
return View(_someDataCreator);
o si devuelve un objeto, puede devolver ese resultado:
var result = _someDateCreator.Create(...); return View(result);
y en su opinión, haga referencia a ese tipo:
@model My.Namespace.MyObject
ViewData
se usa para pasar datos de los controladores a las vistas y dentro de las vistas, incluidas las vistas parciales y los diseños. Puede intentar usar TempData
, aquí hay una demostración:
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"; } }
Puesta en marcha:
public void ConfigureServices(IServiceCollection services) { ... services.AddControllersWithViews(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); services.AddSingleton<MyDepedency, MyDepedency>(); }
Controlador:
public class HomeController : Controller { public MyDepedency _myDepedency; public HomeController(MyDepedency myDepedency) { _myDepedency = myDepedency; } public IActionResult Index() { _myDepedency.Create(); return View(); }
Vista:
<h1>@TempData.Peek("SomeData")</h1>