سؤال

This is my model:

public class StockLine : Keyed
{
    /.../

    /// <summary>
    /// Reference to the delivery note line that created the current stock line.
    /// </summary>    
    [Navigation]
    [Display(ResourceType = typeof(Resources.ApplicationResources), Name = "DeliveryNoteLine")]
    public virtual DeliveryNoteLine DeliveryNoteLine { get; set; }

}

One StockLine could be related to its corresponding DeliveryNoteLine.

What I want to implement is that when you delete the DeliveryNoteLine, it must also delete its corresponding StockLine. But I do not know how possibly doing this.

This is my controller:

/// <summary>
/// Returns the default Delete view for the TEntity object.
/// </summary>
/// <param name="id">Id of the TEntity object to delete.</param>
/// <returns>Redirection to the Index action if an error occurred, the Delete View otherwise.</returns>
public virtual ActionResult Delete(string id)
{
    var request = new RestSharp.RestRequest(Resource + "?id={id}", RestSharp.Method.GET) { RequestFormat = RestSharp.DataFormat.Json }
        .AddParameter("id", id, RestSharp.ParameterType.UrlSegment);
    var response = Client.Execute(request);

    // Deserialize response
    var model = DeserializeResponse<TEntity>(response);
    HandleResponseErrors(response);

    if (Errors.Length == 0)
        return View(model);
    else
    {
        ViewBag.Errors = Errors;
        return RedirectToAction("Index");
    }
}

/// <summary>
/// Handles the POST event for the Delete action.
/// </summary>
/// <param name="id">Id of the TEntity object to delete.</param>
/// <param name="model">TEntity object to delete.</param>
/// <returns>Redirection to the Index action if succeeded, the Delete View otherwise.</returns>
[HttpPost]
public virtual ActionResult Delete(string id, TEntity model)
{
    var request = new RestSharp.RestRequest(Resource + "?id={id}", RestSharp.Method.DELETE) { RequestFormat = RestSharp.DataFormat.Json }
        .AddParameter("id", id, RestSharp.ParameterType.UrlSegment);
    var response = Client.Execute(request);

    // Handle response errors
    HandleResponseErrors(response);

    if (Errors.Length == 0)
        return RedirectToAction("Index");
    else
    {
        request = new RestSharp.RestRequest(Resource + "?id={id}", RestSharp.Method.GET) { RequestFormat = RestSharp.DataFormat.Json }
            .AddParameter("id", id, RestSharp.ParameterType.UrlSegment);
        response = Client.Execute(request);
        model = DeserializeResponse<TEntity>(response);

        ViewBag.Errors = Errors;
        return View(model);
    }
}

Any ideas??

هل كانت مفيدة؟

المحلول

I solved it this way:

StockLinesController.cs

/// <summary>
/// Service returning API's StockLine that matches the given DeliveryNote id.
/// </summary>
/// <param name="DeliveryNoteLineId">The id of the DeliveryNoteLine that created the StockLine</param>
/// <returns>Returns the StockLine created by the given DeliveryNoteLine</returns>
public ActionResult GetStockLine(string DeliveryNoteLineId)
{
    // Only perform the request if the data is outdated, otherwise use cached data.
    if (DateTime.Now.AddMinutes(-10) > _cacheStockLines_lastCall.GetValueOrDefault(DateTime.MinValue))
    {
        var request = new RestSharp.RestRequest("StockLines/Get", RestSharp.Method.GET) { RequestFormat = RestSharp.DataFormat.Json };
        var response = Client.Execute(request);
        _cacheStockLines = DeserializeResponse<List<StockLine>>(response);
        _cacheStockLines_lastCall = DateTime.Now;
    }

    // Return the stock line created by the delivery note line introduced my parameter
    var ret = _cacheStockLines
        .Where(x => (x.DeliveryNoteLine != null && x.DeliveryNoteLine.Id == DeliveryNoteLineId))
        .Select(x => new { label = "ID", value = x.Id });

    return Json(ret, JsonRequestBehavior.AllowGet);
}

DeliveryNoteLinesController.cs

/// <summary>
/// Handles the POST event for the Delete action.
/// </summary>
/// <param name="id">Id of the TEntity object to delete.</param>
/// <param name="model">TEntity object to delete.</param>
/// <returns>Redirection to the Index action if succeeded, the Delete View otherwise.</returns>
[HttpPost]
public override ActionResult Delete(string id, DeliveryNoteLine model)
{
    //This code deletes the StockLine
    var stocks_request = new RestSharp.RestRequest("GetStockLine?DeliveryNoteLineId={id}", RestSharp.Method.GET) { RequestFormat = RestSharp.DataFormat.Json }
        .AddParameter("id", id, RestSharp.ParameterType.UrlSegment);
    var stocks_response = Client.Execute(stocks_request);
    var stockline = DeserializeResponse<StockLine>(stocks_response);
    var reqdelstk = new RestSharp.RestRequest("StockLine?id={id}", RestSharp.Method.DELETE) { RequestFormat = RestSharp.DataFormat.Json }
        .AddParameter("id", stockline.Id, RestSharp.ParameterType.UrlSegment);
    var resdelstk = Client.Execute(reqdelstk);

    //This code deletes the DeliveryNoteLine
    var request = new RestSharp.RestRequest(Resource + "?id={id}", RestSharp.Method.DELETE) { RequestFormat = RestSharp.DataFormat.Json }
        .AddParameter("id", id, RestSharp.ParameterType.UrlSegment);
    var response = Client.Execute(request);

    // Handle response errors
    HandleResponseErrors(response);

    if (Errors.Length == 0)
        return RedirectToAction("Index");
    else
    {
        request = new RestSharp.RestRequest(Resource + "?id={id}", RestSharp.Method.GET) { RequestFormat = RestSharp.DataFormat.Json }
            .AddParameter("id", id, RestSharp.ParameterType.UrlSegment);
        response = Client.Execute(request);
        model = DeserializeResponse<DeliveryNoteLine>(response);

        ViewBag.Errors = Errors;
        return View(model);
    }
}

نصائح أخرى

I guess there's two ways of doing this.

1) At your API you handle this double deletion with a single request to delete on DeliveryNoteLine, or

2) You make two API requests to delete 1st the StockLine and 2nd the DeliveryNoteLine

It seems by the code you're doing no.2

If that's the case, I think the "Resource" parameter must be different in the 1st call?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top