2016-05-07 3 views
0

У меня есть класс заказа, вы можете сделать Заказы и просмотреть заказы. Однако теперь я пытаюсь создать страницу «Возвращает», которая в основном позволяет пользователю ввести причину возврата, а затем распечатать причину/счет-фактуру. У меня есть порядок создания формы, но я не уверен, как связать 2, чтобы сказать Это возвращается к этому заказу все, что я могу сделать, это создать общий возврат, который ни к чему не связан. Я установил отношения. Я просто не уверен, как подключить возврат к определенному заказу. Я знаю, что это основной вопрос, я просто не мог найти что-либо онлайн, чтобы помочь мне. Im студент, и объяснение было бы очень полезно, поскольку мне нужно использовать аналогичные методы для этого в других аспектахВзаимосвязь между классами Заказать-Возврат

Вот мой контроллер для просмотра MyOrders и ReturnsForm

namespace T_shirt_Company_v3.Controllers 
{ 
    public class MyOrderController : Controller 
    { 
     TshirtStoreDB db = new TshirtStoreDB(); 


     /// <summary> 
     /// Returns a list of Orders made by the user 
     /// </summary> 
     /// <param name="date">choose date period viewing orders</param> 
     /// <param name="order">Orders being viewed</param> 
     /// <returns></returns> 
     [Authorize] 
     public ActionResult Index(string date, Order order) 
     { 
      TshirtStoreDB db = new TshirtStoreDB(); 
      string currentUser = this.User.Identity.GetUserName(); 

      List<T_shirt_Company_v3.ViewModels.MyOrdersViewModel> list = (from o in new TshirtStoreDB().Orders 
        .Where(o => o.Username == currentUser) 
        .OrderByDescending(o => o.OrderDate) 
        .Select(o => new MyOrdersViewModel() 
        { 
         OrderId = o.OrderId, 
         Address = o.Address, 
         FirstName = o.FirstName, 
         LastName = o.LastName, 
         City = o.City, 
         OrderDate = o.OrderDate, 
         PostalCode = o.PostalCode, 
         Total = o.Total, 
         HasBeenShipped = o.HasBeenShipped, 
         PostageList = o.PostageList, 
         Details = (from d in o.OrderDetails 
            select new MyOrderDetails 
            { 
             Colour = d.Product.Colour, 
             Quantity = d.Quantity, 
             Title = d.Product.Title, 
             UnitPrice = d.UnitPrice 
            }).ToList() 
        }).ToList() select o).ToList(); 


       if (date != null) 
       { 
       DateTime today = DateTime.Now.AddDays(Convert.ToInt32(date) * -1); 
       return View(list.Where(x => x.OrderDate >= today).ToList()); 
       } 


      return View(list); 
     } 

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

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult ReturnsForm([Bind(Include = "ReturnId,OrderId,ReturnDate,Reason")] returnDetails returnDetails) 
     { 
      if (ModelState.IsValid) 
      { 
       if (returnDetails != null) 
       { 
        returnDetails.ReturnDate = DateTime.Now; 
       } 

       db.returnDetails.Add(returnDetails); 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 

      return View(returnDetails); 
     } 

    } 
} 

и мой MyOrders вид

@model List<T_shirt_Company_v3.ViewModels.MyOrdersViewModel> 


@{ 
    ViewBag.Title = "My Orders"; 
} 
<style> 
    table, th, td { 
     border: 0px solid black; 
     border-collapse: collapse; 
     margin-bottom:50px; 
     padding-bottom:50px; 
    } 

    th, td { 
     padding: 5px; 
     border-spacing: 10px; 
     text-align: center; 
    } 
</style> 

<center> 
    <h1>My Orders</h1> 
    <br /> 
    @using (Html.BeginForm("Index", "MyOrder", FormMethod.Get)) 
    { 
     <text>Orders Made </text><select id="date" name="date"> 
      <option value="9999">All Orders</option> 
      <option value="1">In the last day</option> 
      <option value="7">In the last week</option> 
      <option value="30">In the last month</option> 
      <option value="365">In the last year</option> 
     </select> 
     <input type="submit" name="submit" value="Search" /> 
    } 
    <table> 
     @foreach (var m in Model) 
     { 

      <tr> 
       @*<td style="background-color: #ffffe0"><b>Order Status</b> <br />@ViewBag.ShippedMessage</td>*@ 
       <td style="background-color: #ffffe0"><b>Order Status</b> <br />@(m.HasBeenShipped ? "Order has been shipped" : "Order is being processed") <br /> @ViewBag.PostageStatus</td> 
       <td style="background-color: #ffffe0"><b>Order Placed</b> <br />@m.OrderDate <br /> @m.PostageList</td> 
       <td style="background-color: #ffffe0"><b>Dispatched to</b> <br />@m.FirstName @m.LastName</td> 
       <td style="background-color: #ffffe0"><b>Delivery Address</b><br /> @m.Address <br /> @m.City <br /> @m.PostalCode <br /> </td> 
       <td style="background-color: #ffffe0"><b>Total Cost</b><br /> £@m.Total</td> 
       <td style="background-color: #ffffe0"><b>Order Number</b><br /> @m.OrderId</td> 
      </tr> 

      foreach (var d in m.Details) 
      { 

       <tr> 
        <td colspan="3" style="text-align: left; background-color:#ADD8E6;"><b>Product Name</b> @d.Title <br /><b>Colour</b> @d.Colour</td> 
        <td style="background-color: #ADD8E6"><b>Price: </b> £@d.UnitPrice</td> 
        <td colspan="2" style="background-color: #ADD8E6"><b>Quantity Ordered: </b> @d.Quantity</td> 
       </tr> 


      } 

      <tr><td>@Html.ActionLink("Return Order", "ReturnsForm")</td></tr> 
      <tr><td></td></tr> 
      <tr><td></td></tr> 
      <tr><td></td></tr> 
     } 


    </table> 
</center> 

Мой ReturnsCreate Просмотреть

@model T_shirt_Company_v3.Models.returnDetails 

@{ 
    ViewBag.Title = "ReturnsForm"; 
} 

<h2>ReturnsForm</h2> 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 
    <div class="form-horizontal"> 
     <h4>returnDetails</h4> 
     <hr /> 
     @Html.ValidationSummary(true, "", new { @class = "text-danger" }) 
     <div class="form-group"> 
      @Html.LabelFor(model => model.Reason, htmlAttributes: new { @class = "control-label col-md-2" }) 
      <div class="col-md-10"> 
       @Html.EditorFor(model => model.Reason, new { htmlAttributes = new { @class = "form-control" } }) 
       @Html.ValidationMessageFor(model => model.Reason, "", new { @class = "text-danger" }) 
      </div> 
     </div> 

     <div class="form-group"> 
      <div class="col-md-offset-2 col-md-10"> 
       <input type="submit" value="Create" class="btn btn-default" /> 
      </div> 
     </div> 
    </div> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

Классы

namespace T_shirt_Company_v3.Models 
{ 
    //[Bind(Exclude = "OrderId")] 
    public partial class Order 
    { 
     [ScaffoldColumn(false)] 
     public int OrderId { get; set; } 

     [ScaffoldColumn(false)] 
     public System.DateTime OrderDate { get; set; } 

     [ScaffoldColumn(false)] 
     [Remote("CheckUserName", "Account")] 
     public string Username { get; set; } 

     [Required] 
     [StringLength(16, ErrorMessage = "Your name is too long")] 
     [Display(Name = "First Name")] 
     public string FirstName { get; set; } 

     [Required(ErrorMessage = "Your last name is required.")] 
     [StringLength(16, ErrorMessage = "Last name is too long.")] 
     [Display(Name = "Last Name")] 
     public string LastName { get; set; } 

     [Required(ErrorMessage = "Address is required.")] 
     public string Address { get; set; } 

     [Required(ErrorMessage = "City is required.")] 
     public string City { get; set; } 

     [Required(ErrorMessage = "Postcode is required.")] 
     [Display(Name = "Post Code")] 
     public string PostalCode { get; set; } 

     [Required(ErrorMessage = "Country is required.")] 
     public string Country { get; set; } 

     [Required(ErrorMessage = "Phone number is required.")] 
     public string Phone { get; set; } 

     [RegularExpression(@"[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}", ErrorMessage = "Email doesn't look like a valid email address.")] 
     public string Email { get; set; } 

     [System.ComponentModel.DataAnnotations.Compare("Email")] 
     [Display(Name = "Confirm your email address")] 
     public string EmailConfirm { get; set; } 


     [ScaffoldColumn(false)] 
     public string PaymentTransactionId { get; set; } 


     [ScaffoldColumn(false)] 
     public bool HasBeenShipped { get; set; } 

     [ScaffoldColumn(false)] 
     //[ReadOnly(true)] 
     public decimal Total { get; set; } 

     [Required] 
     [Range(0, 2, ErrorMessage = "Select a delivery method")] 
     public Postage? PostageList { get; set; } 

     public CardDetails cardDetails { get; set; } 
     //public List<CardDetails> cardDetails { get; set; } 
     public List<OrderDetail> OrderDetails { get; set; } 

     public int ReturnId { get; set; } 
     public virtual returnDetails returns { get; set; } 
    } 

    public enum Postage {[Display(Name = "Standard Delivery - Free")]StandardDelivery, [Display(Name = "First Class Delivery - £5")]FirstClass, [Display(Name = "24 Hour Delivery - £10")]TwentyFourHour } 

    public class returnDetails 
    { 
     [Key] 
     public int ReturnId { get; set; } 

     [ScaffoldColumn(false)] 
     public System.DateTime ReturnDate { get; set; } 

     [Required] 
     public string Reason { get; set; } 

     [ForeignKey("Order")] 
     public int OrderId { get; set; } 
     public virtual Order order { get; set; } 
    } 

} 

Ключи В Return класса

[ForeignKey("Order")] 
public int OrderId { get; set; } 
public virtual Order order { get; set; } 

В ордена Класс

public int ReturnId { get; set; } 
public virtual returnDetails returns { get; set; } 
+0

Вам нужно пройти 'ID' приказа к вашему' метода ReturnsForm', и ваша модель returnDetails должна иметь свойство для 'OrderId' –

+0

@StephenMuecke, как бы я вернул идентификатор? Также я добавил свои классы, у меня есть OrderId set –

+0

. Вы разместили здесь слишком много нерелевантного кода, но я пройду через него и добавлю ответ в ближайшее время. –

ответ

1

В вашем MyOrders.cshtml зрения, вам нужно создать ссылку на ваш метод ReturnsForm() и передать ID порядка

@foreach (var m in Model) 
{ 
    .... 
    @Html.ActionLink("Return Order", "ReturnsForm", new { orderID = m.OrderId }) 
} 

и модифицировать метод

public ActionResult ReturnsForm(int orderID) 
{ 
    returnDetails model = new returnDetails() 
    { 
     OrderId = orderID 
    }; 
    return View(model); 
} 

, а затем в вашем ReturnsCreate.cshtml вид, включая скрытый ввод для объекта

@Html.HiddenFor(m => m.OrderId) 

так что значение будет связано, когда вы отправляете назад модель.

Side Примечание: Приведенный выше код использует модель данных, но это плохая практика, и вы должны использовать модель представления для Returns

+0

Цените усилия, помогающие мне!Работала как шарм, только проблема в том, что Орден по-прежнему является нулевым, хотя Returns OrderId верен, как бы я обновил Order для правильного возвращения? P.s. спасибо за объяснение, это было очень полезно. Кроме того, я собираюсь использовать ViewModel для отображения «ReturnPrint», который будет иметь как заказ, так и возврат на нем, создание прямой модели данных было только для быстрого тестирования, поэтому я мог лучше понять это @StephenMuecke –

+0

Что вы подразумеваете под _Order? еще null_? Вы не создаете никаких элементов управления для 'Order' в представлении' ReturnsCreate', и вы также не должны), просто для 'OrderId', потому что это то, что вам нужно для сохранения данных. Если вы хотите, чтобы заказ отображал свои данные на странице, вам необходимо вызвать базу данных, чтобы получить ее - например. 'var order = db.Orders.Where (x => OrderId = orderId) .FirstOrDefault();') –

+0

Что касается «обновления» возврата в 'Order' - это будет сделано автоматически, у вас есть правильный набор отношений вверх. В дополнение к 'public virtual returnDetails возвращает {get; задавать; } ', вам нужно свойство для FK - например. 'public int returnDetailsId {get; задавать; } ' –