准备工作:

现在添加Customer控制器,同时,在创建控制器的时候,添加Create,Delete,Detail动作。

Customer的模型结构为:

Customer类:CustomerID,LastName,FirstName

现在控制器情况为:

代码

public class CustomerController : Controller
{
        public ActionResult Index()
        {
            return View();
        }

public ActionResult Details(int id)
        {
            return View();
        }

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

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                 return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

public ActionResult Edit(int id)
        {
            return View();
        }

[AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Edit(int id, FormCollection collection)
        {
            try
            {
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
}

可以看到,除Index,Details动作外,其它的CU全是两个动作,由于修饰标签的作用而在不同情况下调用动作来返回视图。

(一)添加列表

在Views中添加Customer文件夹,然后在此文件夹中添加Index视图。并指定强类型Customer,并指定自动生成视图内容:List

代码就不贴了。然后在动作中为视图指定model

public ActionResult Index()
{
    IList<Customer> _list = dd.ShowList();
    return View(_list);
}

Index

CustomerId

FirstName

LastName

 

3

Tom

编辑 | 详细

2

Tom

Song

编辑 | 详细

Create New

现在点击第一条的详细,会发生什么事:

<%= Html.ActionLink("详细", "Details", new { /* id=item.PrimaryKey */ })%>

通过ActionLink来重定向到控制器下的Details动作。

public ActionResult Details(int id)
{
  return View();
}

这个动作接受一个参数,但在列表中没有提供参数:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'Web.Controllers.CustomerController'. To make a parameter optional its type should be either a reference type or a Nullable type.

参数名: parameters

因为在Details方法(动作)动作中要求有一个int型参数,但在传递时传递的是一个Null值,解决:

1 为Details方法的参数改为可空整形

2 传递参数

现在为Details动作添加视图,Details。这个就不说了。然后再点详细:

会提示:未将对象引用设置到对象的实例。这是因为还没有为详细视图返回model实例。现在在Details方法(动作)中,添加:

public ActionResult Details(int? id)
{
   Customer customer = new Customer();

if (id.HasValue)
       customer = dd.GetCustomer((int)id);

return View(customer);
}

现在再点详细看看,会发现,可以预览,但没有值,这个很容易理解,传递的值为Null,所以int? id就为空,所以返回的是一个空实例(只有实例的默认值)。这时候可以为其指定一个路由默认值:

new { controller = "News", action = "NewsList", id = "2" },它取的的是id=2这个默认值

接下来为详细传递id参数,即在列表视图中为详细链接添加参数:

<%= Html.ActionLink("详细", "Details", new { id=item.CustomerId })%>

其中id部分与Details动作的参数名相同。现在的详细就可以正常了。

Index

CustomerId

FirstName

LastName

 

3

Tom

编辑 | 详细

2

Tom

Song

编辑 | 详细

Details

CustomerId: 3

FirstName: Tom

(二)创建Create视图

在创建过程中,选择强类型,并选择Customer实体。

然后Create视图的代码就不贴了。简单的说明一下:

·验证控件,每个创建的输入文本框都有相应的ValidationMessage

·Form,添加了表单,但没有指定动作类型,所以这里默认的是Post

Post:表单在提交时,填写在表单中的数据将在底层发送到action=“url”中的url去

Get:表单在提交时,填写在表单中的数据会和action=“url”中的url编码在一起

·输入框,这个会依赖此页的强类型Model而对应生成。

Inherits="System.Web.Mvc.ViewPage<Web.Models.Customer>"

然后看控制器中,可以看到有两个动作:

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

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
    try
    {
       return RedirectToAction("Index");
    }
    catch
    {
       return View();
    }
}

第一个没有参数,返回空视图,它就是为导航到Create页。且默认Method为get

第二个用于处理创建工作,它的Method被标签修饰为Post,它只接受post动作。

还以列表页Index为例,当点击

<%= Html.ActionLink("Create New", "Create") %>时,会get到Create动作。这时执行第一个动作,返回空视图(其实这个视图与返回一个没有值的model一样)

然后在创建时,提交表单,会提交到Create动作,这个时候接爱的谓词为Post:[AcceptVerbs(HttpVerbs.Post)]

所以,在这个动作中做数据添加操作。

(1)参数为FormCollection collection

这个表单集合包含了post过来的表单元素。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
    try
    {
       Customer customer = new Customer 
       { 
           FirstName = collection["FirstName"],
           LastName=collection["LastName"] 
       };
       dd.Add(customer);
       return RedirectToAction("Index");
    }
    catch
    {
       return View();
    }
}

(2)参数为持久实体

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Customer customer)
{
    try
    {
        dd.Add(customer);
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

这个比较方便。

(3)通过Form方法得到参数。

string strFirstName = Request.Form["FirstName"].ToString();
string strLastName = Request.Form["LastName"].ToString();

这个与FormCollection 相同

Index

CustomerId

FirstName

LastName

 

2

Tom

Song

编辑 | 详细

3

Tom

编辑 | 详细

4

编辑 | 详细

5

编辑 | 详细

6

编辑 | 详细

Create New

(三)删除与编辑与上面的同理

例如:删除可以get方式传递一个id值

(四)文件上传

如果有文件上传时,要把Form的

enctype="multipart/form-data"

属性设置一下。

HTML enctype 属性

enctype 属性 -- 代表HTML表单数据的编码方式

application/x-www-form-urlencoded:窗体数据被编码为名称/值对.这是标准的编码格式.

multipart/form-data:窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分.

text/plain:窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符.

Form的这个属性的默认值是:application/x-www-form-urlencoded

在http头中可以看到:Content-Type:application/x-www-form-urlencoded

<input type="file" name="upfile1" />

注意:上传控件的name属性一定要设置,否则提交附件无效!

(1)以默认方式提交文本

FirstName:

LastName:

提交创建:

发送的数据是:

FirstName:松

LastName:武

(2)以默认方式提交上传文件

现在发现,上传文件不能提交到服务器。

查看提交的内容,可以看到:

FirstName=q1&LastName=q2

两个文本属性以kv对传到服务器,而附件:

upfile1=C:\Documents and Settings\Administrator\妗岄潰\Image76.gif

只有一个地址而已

(3) 改用multipart/form-data

这个时候,在http头及提交的数据流里可以看到:

Content-Type:multipart/form-data;

boundary=---------------------------7daf1ec01dc

-----------------------------7daf1ec01dc

Content-Disposition: form-data; name="FirstName"

x

-----------------------------7daf1ec01dc

Content-Disposition: form-data; name="LastName"

X

Content-Disposition: form-data;

name="upfile1"; filename="C:\Documents and Settings\Administrator\妗岄潰\Image76.gif"

Content-Type: image/gif

二进制

以上贴出部分内容。

现在,全部的值都可以得到了。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(FormCollection collection)
{
    try
    {
       Customer customer = new Customer 
       { 
          FirstName = collection["FirstName"], 
          LastName = collection["LastName"] 
       };
       dd.Add(customer);

if (Request.Files.Count > 0)
       {
           Request.Files[0].SaveAs(Server.MapPath("../uploadlist/xx.gif"));
       }

return RedirectToAction("Index");
    }
    catch
    {
       return View();
    }
}

转载于:https://www.cnblogs.com/jams742003/archive/2010/02/08/1665773.html

mvc基础系列说谈(5)——参数与值传递,提交数据相关推荐

  1. 用python前端html后端django_浅谈Django前端后端值传递问题

    前端后端传值问题总结 前端传给后端 通过表单传值 1.通过表单get请求传值 在前端当通过get的方式传值时,表单中的标签的name值将会被当做action的地址的参数 此时,在后端可以通过get请求 ...

  2. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  3. Oracle存储过程中如何根据指定的参数判断该参数的值否存在数据表中:

    摘要:最近项目中用到了Oracle存储过程,所以就自己尝试着写了下,下面我把我遇到的问题描述一下:就是在我处理解析Clob字段中的xml字符串的时候,有个需求就是根据指定的主键参数,来判断该参数的值是 ...

  4. python函数参数的引用传递_Python初学者笔记(八):函数参数的值传递和引用传递...

    函数参数的值传递和引用传递 像我们最熟悉的 C 语言,再写函数参数的同时需要规定函数参数到底是值传递还是引用传递.引用传递导致该参数在函数内的修改出了函数之外也会生效,值传递所有的修改都不会体现到函数 ...

  5. post传值php取不到数据,post请求中的参数形式和form-data提交数据时取不到的问题...

    @Controller 页面form表单请求时不会丢数据 返回json数据时需要加 注解@ResponseBody 请求格式如下 @ResponseBody public Object login(S ...

  6. python是值传递还是引用传递_Python里参数是值传递还是引用传递?

    Python就是把一些参数从一个函数传递到另一个函数,从而使其执行相应的任务.但是你有没有想过,参数传递的底层是如何工作的,原理又是怎样的呢? 实际工作中,很多人会遇到这样的场景:写完了代码,一测试, ...

  7. 类对象作为函数参数进行值传递

    这个是今天踩到的坑,记录一下. 首先先给出几个概念: 1)类对象在创建时会调用构造函数,在释放是会调用析构函数: 2)函数中的局部变量在函数返回后,会由于弹栈从而内存被释放: 3)如果函数参数是采用值 ...

  8. [转载] 由swap引出的java中参数严格值传递问题

    参考链接: Java严格按照值传递 [size=large]博文出处:http://atleeon.com/code/2013/11/28/java-swap-value/ [/size] 晚上看到一 ...

  9. 图解C/C++中函数参数的值传递、指针传递与引用传递

    因为一直对这几种函数参数的传递方式理解的不是很透彻,花了一段时间仔细捋清了他们之间的区别.这个问题也是编程初级阶段会经常遇到的问题,也是有可能在面试中遇到的基本问题,在此进行了简单的总结一下,一是加深 ...

最新文章

  1. 山石网科-Hillstone-IPsec V_P_N常见故障debug排错心得终结版
  2. c#:Reflector+Reflexil 修改编译后的dll/exe文件
  3. 春节英语祝福【中英文对照】
  4. Active Directory的复制拓扑,Active Directory系列之八
  5. 两数之和C++代码实现超详细讲解
  6. 【Blog.Core开源】快速预览Admin界面效果
  7. nacos未授权访问漏洞【原理扫描】
  8. 《大厂内部资料》Redis 性能优化的 13 条军规!全网首发
  9. webpack的安装
  10. 传说有位游客在山顶大声谈论着小孤嫁彭郎的故事
  11. Keepalived实战(3)
  12. 什么样的站点可以***
  13. Vim快速选中、删除、复制引号或括号中的内容
  14. python编程音乐播放器_python 开发在线音乐播放器-简易版
  15. Sublime Text 3.1 编辑管理工程(项目)
  16. 夜谈TCP/IP的起源和胜利
  17. VLD在VS2019中的使用以及应用程序无法正常启动(0xc0150002)
  18. 15针VGA公头焊接示意图
  19. 一个产品经理的工作经历与总结
  20. 该如何去认知Level 2 十档行情数据?

热门文章

  1. STM32开发 -- UTC、UNIX时间戳、北京时间之间的转换
  2. 【密码学】一万字带您走进密码学的世界(下)
  3. [以太坊源代码分析] II. 数据的呈现和组织,缓存和更新
  4. ContentProvider源码分析(原)
  5. IDA Pro ARM指令集和Thumb指令集的切换
  6. Android安全教程(1)---Fiddler简易使用教程之配置环境
  7. 高性能负载均衡设计入门篇
  8. 谷歌浏览器中文版_GitHub上最励志的计算机自学教程:8个月,从中年Web前端到亚马逊百万年薪软件工程师 | 中文版...
  9. 网易内推java 面试_网易内推面试
  10. Qt插件:在Qt中进行ROS开发(一)