首页 > 代码库 > (五)ASP.NET MVC 中关于 Action 的参数

(五)ASP.NET MVC 中关于 Action 的参数

  在ASP.NET MVC 的 Controller 类下有多个 Method,如果这些 Method 都是 public 修饰的和返回值类型是 ActionResult 类型的,这些方法就时 Action。通过 “Controller 名字/方法名” 访问的时候就会执行对应的方法。

  Action 有三种类型的参数:普通参数,Model 类, FormCollection。

  普通参数:构架会自动把用户请求的值根据参数名字映射到对应的值。

  Model 类:这种类叫 ViewModel

  FormCollection:采用 fc["name"] 这种方式访问,适用于表单元素不确定的情况

例如:在 cshtml 中有一个表单

<form action="Show" method="post">
    <input type="text" name="Name" value=http://www.mamicode.com/"" />
    <input type="text" name="Age" value=http://www.mamicode.com/"" />
    <input type="submit" value=http://www.mamicode.com/"submit" />
</form>

有一个类 Person: 

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

在Controller 中 Action 的参数:

//参数名要跟表单中对应参数的 name 属性一样,但大小写没关系
public ActionResult Show(string name, int age)
{
        return Content(name + age) ;
}
 public ActionResult Show(Person p)
 {
        return Content(p.Name + p.Age) ;
 } 
//fc 的索引名跟表单中对应参数的 name 属性一样,但大小写没关系
public ActionResult Show(FormCollection fc)
 {
        string name = fc["Name"];
        string age = fc["Age"];
        return Content(name+age) ;
 }

 


 

  Action 的方法不能重载,所以如果一个 Controller 中不能同时存在两个相同的 Action

public ActionResult T1()
{
    return View();  
}

public ActionResult T1(Person p)
{
    return View();
}

//以上两个 Action 不能同时存在

  但是如果给 Action方法标注上 [HttpGet], 和 [HttpPost] 的 Attribute,可以同时存在,这样当页面发出 Get 请求时执行标注 [HttpGet] 的方法,当发出 Post 请求的时候执行标注 [HttpPost] 的 Action。通常标注[HttpGet] 的 Action 用来展示初始页面,标注 [HttpPost] 的 Action 用来处理表单提交。  

[HttpGet]
public ActionResult T1()
{
    return View();  
}

[HttpPost]
public ActionResult T1(Person p)
{
    //TODO:...
    return View();
}

 


 

  Action 的参数可以是一部分普通参数,一部分 Model:

public ActionResult T2(string adress, Person p)
{
    //TODO:...
    return View();  
}

 

  Action 参数如果在请求中没有对应的值,则 Model 类的形式会取默认值。如果是普通参数的形式会报错,同时这个参数如果是值类型,而且允许为空,则要使用可空类型,或者使用 C# 的可以参数语法设定默认值。

//public ActionResult T1(string name, int? age)
//{}
//
//或者
//
//public ActionResult T1(string name, int age = 0)
//{}

 


 

  对于在 ASP.NET MVC 中上传文件,参数使用 HttpPostedFileBase 类型,同时在 form 表单中有 enctype="multipart/form-data 这个属性。

(五)ASP.NET MVC 中关于 Action 的参数