gpt4 book ai didi

c# - MVC 多个表单合并为 1 个 Controller

转载 作者:太空宇宙 更新时间:2023-11-03 12:40:46 27 4
gpt4 key购买 nike

我正在尝试弄清楚如何缩短我的代码,但我一直卡在这个问题上,请看看这个。

我有这样的表格

@using (Html.BeginUmbracoForm("Save", "Student", FormMethod.Post))
{
<input type="hidden" name="Id" />
<input type="text" name="Name" />
<input type="text" name="NickName" />
<input type="text" name="Age" />
<input type="text" name="Address" />
<input type="submit" />
}

这是我的 Controller

public ActionResult Save(Student s) {
var record = _db.Students.Find(s.Id);
if(record != null) {
record.Id = s.Id;
record.Name = s.Name;
record.NickName = s.NickName;
record.Age = s.Age;
record.Address = s.Address;
_db.SaveChanges();
}
return RedirectToCurrentUmbracoUrl():
}

最后是我的模型

public class Student() {
public int Id { get; set; }
public string Name { get; set; }
public string NickName { get; set; }
public int Age { get; set; }
public int Address { get; set }
}

好的,上面的代码工作正常,没问题。

我的问题

我有不同的观点,我只更新了学生的一些类属性,我想使用同一个 Controller 。请参阅下面我的 3 个表格

@using (Html.BeginUmbracoForm("Save", "Student", FormMethod.Post))
{
<input type="hidden" name="Id" />
<input type="text" name="Name" />
<input type="submit" />
}

@using (Html.BeginUmbracoForm("Save", "Student", FormMethod.Post))
{
<input type="hidden" name="Id" />
<input type="text" name="Age" />
<input type="submit" />
}

@using (Html.BeginUmbracoForm("Save", "Student", FormMethod.Post))
{
<input type="hidden" name="Id" />
<input type="text" name="Address" />
<input type="submit" />
}

现在的问题是,如果我提交第一个表单,那么 Student AgeStudent Address 将包含 null 或空值,因为它们没有值。

那么如果不创建三个 Controller ,我怎么能做到这一点:

  • public ActionResult SaveStudentName(),
  • public ActionResult SaveStudentAge()
  • public ActionResult SaveStudentAddress()

保存特定学生的详细信息?

我只想使用 Controller public ActionResult Save(),其中与保存学生详细信息相关的所有操作都必须在此处转发。

抱歉我的英语不好,我希望有人能给我提示。

最佳答案

不幸的是,没有办法实现您在这里寻找的东西。 @apomene 的回答在技术上是可行的,只要您可以使属性可以为 null 或可以依赖诸如 int (0) 之类的默认值实际上不是有效值。例如,随着年龄的增长,您可以:

if (s.Age != default(int))

但这假设 0 永远不是有效值。在这种情况下,它可能没问题,但可能并非总是如此。但是,这种方法的一个大问题是它允许篡改。例如,如果您只允许编辑 Age,这并不能阻止恶意用户编辑页面以添加一个字段来表示 Name。在发布时,这个恶意添加的值也会被保存。

因此,您真正需要的是针对表单的每个变体的特定 View 模型,这意味着接受该特定 View 模型的特定操作。在典型的面向对象场景中,此时您可能会想说,好吧,我将只使用它们都可以实现的基类或接口(interface)。不幸的是,基于路由框架的工作方式以及必须通过传递由发布的数据组成的特定类的特定实例来调用操作这一事实,根本没有可靠的使用方法基类或接口(interface)。

总而言之,无论您选择在页面上包含哪些特定字段,您要么需要对每个变体进行单独的操作,要么必须允许模型上的任何和所有数据都可能被编辑。没有其他选择。

编辑

值得注意的是,仅仅因为您需要单独的操作并不意味着您必须重复代码。你总是可以做这样的事情:

public ActionResult EditAge(int id, AgeViewModel model)
{
UpdateStudent(id, age: model.Age);
return View();
}

public ActionResult EditName(int id, NameViewModel model)
{
UpdateStudent(id, name: model.Name);
return View();
}

...

protected void UpdateStudent(int id, string name = null, int? age = null)
{
var student = db.Students.Find(id);
if (name != null)
{
student.Name = name;
}
if (age.HasValue)
{
student.Age = age.Value;
}

db.Entry(student).State = EntityState.Modified;
db.SaveChanges();
}

这当然是非常简化的表单处理,但这里的主要想法是可以提取出您的学生保存代码,然后每个操作都可以调用这个通用方法,同时仍然接受独特的 View 模型。

关于c# - MVC 多个表单合并为 1 个 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39082369/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com