MVC的主从表编辑

nickppa 2013-01-02 05:28:06
刚学mvc没几天,想在mvc中搞个webform中gridView的效果
脚本:

(function ($) {

$.fn.nGridView = function () {
var m_Ndatas = new NDatas();
var r = new NRow();
var isInsert = true;
var strHtml = "";

this.addData = function (inputName, displayName) {
m_Ndatas.add(new NData(inputName, displayName));
return this;
};

this.addCell = function () {
var cell = new NCell();
r.Cells.push(cell);
return cell;
};

function NDatas() {
this.datas = new Array();
this.add = function (data) {
this.datas.push(data);
};
this.getI = function (dispalyName) {
var result = "";
$.each(this.datas, function (i, n) {
if (n.displayName.toLowerCase() == dispalyName.toLowerCase()) {
result = n.inputName;
return;
}
});
return result;
};
this.getD = function (inputName) {
var result = "";
$.each(this.datas, function (i, n) {
if (n.inputName.toLowerCase() == inputName.toLowerCase()) {
result = n.displayName;
return;
}
});
return result;
};
this.getIValue = function (tr, dispalyName) {
var result = "";
$.each(this.datas, function (i, n) {
if (n.displayName.toLowerCase() == dispalyName.toLowerCase()) {
result = tr.find("[name='" + n.inputName + "']").val();
return;
}
});
return result;
};
this.setIValue = function (tradd, tr) {
$.each(this.datas, function (i, n) {
tradd.find("[name='" + n.inputName + "']").val(tr.find("[name='" + n.displayName + "']").val());
});
};
this.init = function (paramTr) {
$.each(this.datas, function (i, n) {
paramTr.find("[name='" + n.inputName + "']").val("");
});
};
}
function NData(inputName, displayName) {
this.inputName = inputName;
this.displayName = displayName;
}
function NControl(dataName, normalHtml) {
this.Name = dataName;
this.Html = "<input type=\"hidden\" name=\"[name]\" value=\"[data]\" />[data]";
if (normalHtml) {
this.Html = normalHtml;
}
this.toString = function (paramTr) {
return this.Html.replace(/\[data\]/g, m_Ndatas.getIValue(paramTr, this.Name)).replace(/\[name\]/g, this.Name);
};
}
function NCell(control) {
this.Controls = new Array();
this.toString = function (paramTr) {
var strResult = "<td>";
$.each(this.Controls, function (i, n) {
strResult += n.toString(paramTr);
});
return strResult + "</td>";
};
this.add = function (dataName, normalHtml) {
this.Controls.push(new NControl(dataName, normalHtml));
return this;
};
if (control) {
this.Controls.push(control);
}
}
function NRow(cell) {
this.Cells = new Array();
this.toString = function (paramTr) {
var strResult = "<tr>";
$.each(this.Cells, function (i, n) {
strResult += n.toString(paramTr);
});
return strResult + "<td><a href=\"java" + "script:void(0);\" class=\"edit\">编辑</a></td><td><a href=\"java" + "script:void(0);\" class=\"del\">删除</a></td></tr>";
};
if (cell) {
this.Cells.push(cell);
}
}
function getNormalTr(paramTr) {
return r.toString(paramTr);
}
function setUpdateCell(paramTr) {
paramTr.find(".add").replaceWith("<a href=\"javas" + "cript:void(0);\" class=\"update\">更新</a><a href=\"javas" + "cript:void(0);\" class=\"cancel\">取消</a>");
}
function setAddCell(paramTr) {
paramTr.find(".update").replaceWith("<a href=\"javas" + "cript:void(0);\" class=\"add\">添加</a>");
paramTr.find(".cancel").remove();
}
$(".add").live("click", function () {
var tr = $(this).parents("tr:first").eq(0);
tr.before(getNormalTr(tr));
m_Ndatas.init(tr);
});
$(".edit").live("click", function () {
var tr = $(this).parents("tr:first").eq(0);
var tradd = tr.siblings(".tradd:first").eq(0);
if (isInsert) {
strHtml = tr[0].outerHTML;
setUpdateCell(tradd);
m_Ndatas.setIValue(tradd, tr);
tr.replaceWith(tradd);
}
else {
// 恢复原html
tradd.prev().after(strHtml);
m_Ndatas.setIValue(tradd, tr);
strHtml = tr[0].outerHTML;
tr.replaceWith(tradd);
}
isInsert = false;
});
$(".update").live("click", function () {
var tr = $(this).parents("tr:first").eq(0);
var table = $(this).parents("table:first").eq(0);
tr.prev().after(getNormalTr(tr));
setAddCell(tr);
table.append(tr);
m_Ndatas.init(tr);
isInsert = true;
});
$(".cancel").live("click", function () {
var tr = $(this).parents("tr:first").eq(0);
tr.prev().after(strHtml);
var table = $(this).parents("table:first").eq(0);
setAddCell(tr);
table.append(tr);
m_Ndatas.init(tr);
isInsert = true;
});
$(".del").live("click", function () {
if (confirm("确定删除吗?")) {
var tr = $(this).parents("tr:first").eq(0);
tr.remove();
}
});
return this;
};
})(jQuery);

.cshtml:
@model TestMvc.Models.Movie

@{
ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
<legend>Movie</legend>

<div class="editor-label">
@Html.LabelFor(model => model.Title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title)
@Html.ValidationMessageFor(model => model.Title)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.ReleaseDate)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.ReleaseDate, "DateEditTemplate")
@Html.ValidationMessageFor(model => model.ReleaseDate)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.Genre)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Genre)
@Html.ValidationMessageFor(model => model.Genre)
</div>

<div class="editor-label">
@Html.LabelFor(model => model.Price)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
<table class="gv">
<tr>
<th>
Title
</th>
<th>
Title2
</th>
<th>添加</th>
<th>删除</th>
</tr>
@if(Model != null)
{
foreach(var item in Model.MovieDetails)
{
<tr><td><input type="hidden" name="DetailTitle" value="@item.Title" />@item.Title</td>
<td><input type="hidden" name="DetailTitle2" value="@item.Title2" />@item.Title2</td>
<td><a href="javascript:void(0);" class="edit">编辑</a></td><td><a href="javascript:void(0);" class="del">删除</a></td></tr>
}
}
<tr class="tradd"><td><input name="Detail_Title" /></td><td><input name="Detail_Title2" /></td><td><a href="javascript:void(0);" class="add">添加</a></td><td></td></tr>
</table>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}

<div>
@Html.ActionLink("Back to List", "Index")
</div>
<input type="hidden" value="" />
@if(ViewData["script"] != null)
{
<script type="text/javascript">@Html.Raw(ViewData["script"].ToString())</script>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/jqueryui")
@Scripts.Render("~/bundles/jqueryGv");
@Styles.Render("~/Content/themes/base/css")
<script type="text/javascript">
$(function () {
$(".DateTime").datepicker({ showOn: "button", buttonImage: "@Href("~/images/calendar.gif")", buttonImageOnly: true });
var gv = $(".gv").nGridView();
gv.addData("Detail_Title", "DetailTitle").addData("Detail_Title2", "DetailTitle2");
gv.addCell().add("DetailTitle");
gv.addCell().add("DetailTitle2");
});
</script>
}

Cotrol:
private ActionResult ShowMessage(object oo, string paramMessage)
{
ViewData["script"] = "alert('" + paramMessage + "');";
return View(oo);
}
//
// POST: /Movies/Create
[HttpPost]
public ActionResult Create(Movie movie)
{
movie.MovieDetails.Clear();
string[] strTitles = Request["DetailTitle"] == null ? new string[0] : Request["DetailTitle"].ToString().Split(new char[] { ',' });
string[] strTitle2s = Request["DetailTitle2"] == null ? new string[0] : Request["DetailTitle2"].ToString().Split(new char[] { ',' });
for(int i = 0; i <= strTitles.Length - 1; i++)
{
movie.MovieDetails.Add(new MovieDetail() { Title = strTitles[i].Trim(), Title2 = strTitle2s[i] });
}
if (ModelState.IsValid)
{
if(movie.MovieDetails.Count == 0)
{
return ShowMessage(movie, "明细不能为空!");
}
foreach(var item in movie.MovieDetails)
{
string strTemp = item.Title.Trim();
if(strTemp.Length == 0)
{
return ShowMessage(movie, "标题不能为空!");
}
}
db.Movies.Add(movie);
db.SaveChanges();
return RedirectToAction("Index");
}

return View(movie);
}

目前就搞到Create,我感觉我使用Request["DetailTitle"]很狗血阿,有没有更好的解决方案,比如说把主从表的model放一起弄个model直接用呢?
...全文
282 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
a410787073 2013-01-05
  • 打赏
  • 举报
回复
前台data={"name":"sdfdsf","set":"nv".......} 拼凑好。传递给后台。然后 序列化成model
Assassin_ 2013-01-05
  • 打赏
  • 举报
回复
json传model吧!
浪花三朵朵 2013-01-05
  • 打赏
  • 举报
回复
建立两个表合起来的model类
H_Gragon 2013-01-03
  • 打赏
  • 举报
回复
不太懂,帮顶!
nickppa 2013-01-03
  • 打赏
  • 举报
回复
引用 3 楼 jason_dct 的回复:
你说的失控是?应该不会。 代码应该没什么问题。
比如说这个数据验证吧,原先MVC会通过@Html.ValidationMessageFor(model => model.Price)和if (ModelState.IsValid) 这种优雅的方式来处理,而我这个通过原始的Request取数据不可避免的会产生另外一套自定义的数据验证机制,导致整个系统中有2套数据验证机制。不好维护
YK138168 2013-01-03
  • 打赏
  • 举报
回复
来帮忙顶,期待答案!
段传涛 2013-01-03
  • 打赏
  • 举报
回复
引用 2 楼 nickppa 的回复:
我这个是做了个简单的测试,如果明细表中的数据列一多,我这种方式就需要取很多的Request["XXX"],不好管理啊,会失控的
你说的失控是?应该不会。 代码应该没什么问题。
nickppa 2013-01-03
  • 打赏
  • 举报
回复
我这个是做了个简单的测试,如果明细表中的数据列一多,我这种方式就需要取很多的Request["XXX"],不好管理啊,会失控的
段传涛 2013-01-02
  • 打赏
  • 举报
回复
代码好长 没有细读。 MVC 相对来说让他们尽量独立,不要一味的刻意去使用MVC而使用他。 你的代码的Request["DetailTitle"] 确实还是普通的方法。如果因为这一个而搞个model 得不偿失。
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 功能模块介绍 技术架构 数据库服务器主从分离:支持多台数据库服务器主从分离及读写分离,便于扩展(需付费)。 伪静态 Rewrite:通过伪静态可减轻服务器负担,提升关键词排名。 图片云存储:支持阿里云高性能对象存储服务。 缓存机制:支持 Memcached、redis、eAccelerator、xcache、apc、file 等分布式对象缓存系统。 负载均衡:提供高性能流量分发的负载均衡(需咨询)。 安全防范:具备防范 CSRF 攻击、SQL 注入、密码加密算法、前后台输入验证等功能,全方位提升系统安全系数。 业务应用层 系统参数配置:拥有强大的系统参数配置功能,可快速自定义配置。 MVC 模式架构:全站采用 MVC 架构,APP 使用主流框架。 商城可视化编辑:商城专题及商家店铺支持可视化编辑,应用更加灵活。 安装环境 PHP 环境支持:支持 PHP 5.3 及以上版本,保障高性能运行。 数据备份:支持数据备份,防止数据丢失。 文件校验:可检测系统文件的正确性,确保商城功能正常使用。 系统对接 移动端数据对接:购买移动端后可实现与移动端数据无缝对接。 短信接口对接:支持阿里云通、短信宝、云短信网、短信网、云片、亿美等多家短信接口。 CSV 数据导入:支持导入淘宝、天猫 CSV 数据。 API 开放接口:提供开放接口供所需人员使用。 物流跟踪接口:支持快递 100、快递鸟物流数据接口。 第三方登录:支持 QQ、微信、新浪微博第三方接口登录。 ERP 对接:支持其他 ERP 平台接口对接(需付费)。 极验验证:支持极验验证接口,防止垃圾注册(需付费)。 商家中心(PC 端商城【B2B2C】) 商家入驻申请流程:设有独立商家申请页,入驻流程严格有效且具备审核机制。 可视化店铺装修:商家可依

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧