```csharp
// overloading
public string SayHi()=> "Hi...";
[HttpPost]
public string SayHi(string username)=> $"Hi {username}";
// string
public string XmlDemo()
=> "<book><title>mvc</title><price>1000</price></book>";
// content helper
public ActionResult XmlDemo2()
{
return Content("<book><title>mvc</title><price>1000</price></book>"
,"text/xml");
}
// json helper
public ActionResult JsonDemo()
{
var obj = new { id=1, Name="aaa" };
return Json(obj, JsonRequestBehavior.AllowGet);// c# object-->json
}
//=================================
// homecontroller.cs
public ActionResult Index()
{
ViewBag.date1=DateTime.Now;
ViewData["date2"]=DateTime.Now;
return View();
}
// home/index.cshtml
<ul>
<li>@ViewData["date1"]</li>
<li>@ViewBag.date2</li>
</ul>
//===================================
// operacontroller.cs
public ActionResult Details(int? id)
{
if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
Opera opera=context.Operas.Find(id);
if (opera == null) return HttpNotFound();
return View(opera);
}
// opera/details.cshtml
@model Mod02.Models.Opera
<h1>Opera Details</h1>
<ul>
<li>
@Html.DisplayNameFor(m => m.Title) :
@Html.DisplayFor(m => m.Title)
</li>
<li>
@Html.DisplayNameFor(m => m.Year) :
@Html.DisplayFor(m => m.Year)
</li>
<li>
@Html.DisplayNameFor(m => m.Composer) :
@Html.DisplayFor(m => m.Composer)
</li>
</ul>
<p>
@Html.ActionLink("Back to List","Index")
</p>
// opera/index.cshtml
<table border="1">
<thead>
<tr>
<th>@Html.DisplayNameFor(m => m.Title)</th>
<th>@Html.DisplayNameFor(m => m.Year)</th>
<th>@Html.DisplayNameFor(m => m.Composer)</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(m => item.Title)</td>
<td>@Html.DisplayFor(m => item.Year)</td>
<td>@Html.DisplayFor(m => item.Composer)</td>
<td>
@Html.ActionLink("Details","Details",new {id=item.OperaID})
</td>
</tr>
}
</tbody>
</table>
// home/index.cshtml
@Html.ActionLink("Opera List","Index","Opera")
//=================================
// operacontroller.cs
public ActionResult Create()
{
return View();
}
[HttpPost]
public ActionResult Create(Opera opera)
{
if (ModelState.IsValid)
{
context.Operas.Add(opera);
context.SaveChanges();
return RedirectToAction("Index");
}
return View(opera);
}
// opera/create.cshtml
@model Mod02.Models.Opera
<h1>Opera Create</h1>
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.Title)
@Html.EditorFor(m => m.Title)
</div>
<div>
@Html.LabelFor(m => m.Year)
@Html.EditorFor(m => m.Year)
</div>
<div>
@Html.LabelFor(m => m.Composer)
@Html.EditorFor(m => m.Composer)
</div>
<div>
<input type="submit" value="Save" />
</div>
}
<p>
@Html.ActionLink("Back to List", "Index")
</p>
// opera/index.cshtml
<p>
@Html.ActionLink("Create", "Create")
</p>
//===================================
// opera/create.cshtml
<div>
@Html.LabelFor(m => m.Title)
@Html.EditorFor(m => m.Title)
@Html.ValidationMessageFor(m => m.Title)
</div>
<div>
@Html.LabelFor(m => m.Year)
@Html.EditorFor(m => m.Year)
@Html.ValidationMessageFor(m => m.Year)
</div>
<div>
@Html.LabelFor(m => m.Composer)
@Html.EditorFor(m => m.Composer)
@Html.ValidationMessageFor(m => m.Composer)
</div>
<script src="~/Scripts/jquery-3.7.1.js"></script>
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
//===========================
// opera/create.cshtml
@using (Html.BeginForm())
{
@Html.ValidationSummary()
<div>
@Html.LabelFor(m => m.Title)
@Html.EditorFor(m => m.Title)
@Html.ValidationMessageFor(m => m.Title, "*")
</div>
<div>
@Html.LabelFor(m => m.Year)
@Html.EditorFor(m => m.Year)
@Html.ValidationMessageFor(m => m.Year, "*")
</div>
<div>
@Html.LabelFor(m => m.Composer)
@Html.EditorFor(m => m.Composer)
@Html.ValidationMessageFor(m => m.Composer, "*")
</div>
<div>
<input type="submit" value="Save" />
</div>
}
// site.css
body {
padding-top: 50px;
padding-bottom: 20px;
}
/* Set padding to keep content from hitting the edges */
.body-content {
padding-left: 15px;
padding-right: 15px;
}
/* Set width on the form input elements since they're 100% wide by default */
input,
select,
textarea {
max-width: 280px;
}
/* styles for validation helpers */
.field-validation-error {
color: #b94a48;
}
.field-validation-valid {
display: none;
}
input.input-validation-error {
border: 1px solid #b94a48;
}
input[type="checkbox"].input-validation-error {
border: 0 none;
}
.validation-summary-errors {
color: #b94a48;
}
.validation-summary-valid {
display: none;
}
//=================================
// operacontroller.cs
public ActionResult Edit(int? id)
{
if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
Opera opera = context.Operas.Find(id);
if (opera == null) return HttpNotFound();
return View(opera);
}
[HttpPost]
public ActionResult Edit(Opera opera)
{
if (ModelState.IsValid)
{
context.Entry(opera).State=EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index");
}
return View(opera);
}
// opera/edit.cshtml
<h1>Opera Edit</h1>
@using (Html.BeginForm())
{
@Html.HiddenFor(m=>m.OperaID)
@Html.ValidationSummary()
<div>
@Html.LabelFor(m => m.Title)
@Html.EditorFor(m => m.Title)
@Html.ValidationMessageFor(m => m.Title, "*")
</div>
<div>
@Html.LabelFor(m => m.Year)
@Html.EditorFor(m => m.Year)
@Html.ValidationMessageFor(m => m.Year, "*")
</div>
<div>
@Html.LabelFor(m => m.Composer)
@Html.EditorFor(m => m.Composer)
@Html.ValidationMessageFor(m => m.Composer, "*")
</div>
<div>
<input type="submit" value="Save" />
</div>
}
<p>
@Html.ActionLink("Back to List", "Index")
</p>
// opera/index.cshtml
<tr>
<td>@Html.DisplayFor(m => item.Title)</td>
<td>@Html.DisplayFor(m => item.Year)</td>
<td>@Html.DisplayFor(m => item.Composer)</td>
<td>
@Html.ActionLink("Details", "Details", new { id = item.OperaID })
@Html.ActionLink("Edit", "Edit", new { id = item.OperaID })
</td>
</tr>
//=================================
// operacontroller.cs
public ActionResult Delete(int? id)
{
if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
Opera opera = context.Operas.Find(id);
if (opera == null) return HttpNotFound();
return View(opera);
}
[HttpPost]
[ActionName(nameof(Delete))]
public ActionResult xxx(int? id)
{
if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
Opera opera = context.Operas.Find(id);
if (opera == null) return HttpNotFound();
context.Operas.Remove(opera);
context.SaveChanges();
return RedirectToAction(nameof(Index));
}
// opera/delete.cshtml
<h1>Opera Delete Confirm</h1>
<ul>
<li>
@Html.DisplayNameFor(m => m.Title) :
@Html.DisplayFor(m => m.Title)
</li>
<li>
@Html.DisplayNameFor(m => m.Year) :
@Html.DisplayFor(m => m.Year)
</li>
<li>
@Html.DisplayNameFor(m => m.Composer) :
@Html.DisplayFor(m => m.Composer)
</li>
</ul>
@using (Html.BeginForm())
{
<input type="submit" value="Delete" />
}
<p>
@Html.ActionLink("Back to List","Index")
</p>
// opera/index.cshtml
<table border="1">
<thead>
<tr>
<th>@Html.DisplayNameFor(m => m.Title)</th>
<th>@Html.DisplayNameFor(m => m.Year)</th>
<th>@Html.DisplayNameFor(m => m.Composer)</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(m => item.Title)</td>
<td>@Html.DisplayFor(m => item.Year)</td>
<td>@Html.DisplayFor(m => item.Composer)</td>
<td>
@Html.ActionLink("Details", "Details", new { id = item.OperaID })
@Html.ActionLink("Edit", "Edit", new { id = item.OperaID })
@Html.ActionLink("Delete", "Delete", new { id = item.OperaID })
</td>
</tr>
}
</tbody>
</table>
//==========================
// operacontroller.cs
public ActionResult Delete(int? id)
{
if (id == null) return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
Opera opera = context.Operas.Find(id);
if (opera == null) return HttpNotFound();
context.Operas.Remove(opera);
context.SaveChanges();
return RedirectToAction(nameof(Index));
}
// opera/index.cshtml
<table border="1">
<thead>
<tr>
<th>@Html.DisplayNameFor(m => m.Title)</th>
<th>@Html.DisplayNameFor(m => m.Year)</th>
<th>@Html.DisplayNameFor(m => m.Composer)</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>@Html.DisplayFor(m => item.Title)</td>
<td>@Html.DisplayFor(m => item.Year)</td>
<td>@Html.DisplayFor(m => item.Composer)</td>
<td>
@Html.ActionLink("Details", "Details", new { id = item.OperaID })
@Html.ActionLink("Edit", "Edit", new { id = item.OperaID })
@*@Html.ActionLink("Delete", "Delete", new { id = item.OperaID })*@
@Html.ActionLink("Delete", "Delete", new { id = item.OperaID },
new {onclick="return confirm('Delete');"})
</td>
</tr>
}
</tbody>
</table>
//=====================================
//l ogcactionfilter.cs
public class LogActionFilter:ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Debug.WriteLine(nameof(OnActionExecuted));
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Debug.WriteLine(nameof(OnActionExecuting));
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Debug.WriteLine(nameof(OnResultExecuted));
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Debug.WriteLine(nameof(OnResultExecuting));
}
}
// homecontroller.cs
[LogActionFilter]
public ActionResult Index()
{
Debug.WriteLine("Home...");
return View();
}
//====================================
// logactionfilter.cs
public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.RouteData.Values["controller"];
var action = filterContext.RouteData.Values["action"];
var id = filterContext.RouteData.Values["id"];
Debug.WriteLine($"Log: {controller}/{action}/{id} {DateTime.Now}");
}
}
//global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalFilters.Filters.Add(new LogActionFilter());
}
}
//================================
//web.config
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<root>
<level value="DEBUG" />
<appender-ref ref="FileAppender" />
</root>
<appender name="FileAppender" type="log4net.Appender.FileAppender">
<file value="C:\Logs\MyApp.log" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %level %logger - %message%newline" />
</layout>
</appender>
</log4net>
//global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();
//logactionfilter.cs
public class LogActionFilter : ActionFilterAttribute
{
private static readonly ILog log =
LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.RouteData.Values["controller"];
var action = filterContext.RouteData.Values["action"];
var id = filterContext.RouteData.Values["id"];
log.Info($"Log: {controller}/{action}/{id} {DateTime.Now}");
//Debug.WriteLine($"Log: {controller}/{action}/{id} {DateTime.Now}");
}
}
```