我希望这是问这个问题的正确地方。如果没有,请告知合适的位置在哪里。
意图:用户将能够从下拉列表中选择年份和月份。提交表单后,将生成一个图表以根据选择显示信息。
实现:我的控制器IEnumerable<SelectListItem>
为每个下拉列表创建并存储在模型中,该模型被传递给视图。视图内是对图表操作的调用。
代码:
控制器:
public ActionResult Validate(int month = 0, int year = 0)
{
//Check if input is valid
if (month != 0 && year != 0)
{
ViewBag.Valid = 1;
}
else
{
ViewBag.Valid = 0;
}
ValidateVM model = new ValidateVM();
//Populate years
model.year = Enumerable.Range(2008, DateTime.Now.Year - 2007).Reverse()
.Select(r => new SelectListItem
{
Value = r.ToString(),
Text = r.ToString()
});
//Populate months
string[] months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
model.month = months
.Select((r, index) => new SelectListItem { Text = r, Value = (index + 1).ToString() });
return View(model);
}
模型:
public class ValidateVM
{
public int[] Mdays { get; set; }
public IEnumerable<SelectListItem> month { get; set; }
public IEnumerable<SelectListItem> year { get; set; }
}
看法:
@using (Html.BeginForm("Mday", "Metrics", FormMethod.Get))
{
@Html.DropDownListFor(model => model.month, Model.month)
@Html.DropDownListFor(model => model.year, Model.year)
<input type="submit" />
}
@if (ViewBag.Valid == 1)
{
<img src="@Url.Action("ValidateChart", new { month = Request.QueryString["month"],
year = Request.QueryString["year"]
})" alt="Test"/>
}
问题:提交表单后,一切正常。我已经看到模型将包含所选项目的变量的方法,例如int chosenMonth
. 以任何一种方式做事都有好处吗?
可以像我那样使用 viewbag 吗?我用它来告诉视图输入是否有效,这决定了是否显示图表。我多次听说从不使用 viewbag。为什么是这样?模仿我描述的行为的最佳实践方式是什么?
在调用ValidateChart
(in view) 函数时,我需要使用querystring
来告诉操作生成图表的月份和年份。我也看到这被称为不好的做法,但还没有找到更好的方法来做到这一点。querystring
在不通过范围的情况下访问变量的正确方法是什么request
?
我已经设法让这段代码进入工作状态,但我真的很想学习如何以正确的方式去做。